0

私は Java で Android 開発を行っており、一部のネイティブ パーツ (外部ライブラリ) は C++ で記述されています。

マネージド (Java) アプリケーションからネイティブ (C++) ライブラリに byte[] を渡したい:

// Declaration for the native method in Java
private native void someMethod(byte[] data);

ネイティブ側では、別の提供されたネイティブ関数への引数としてバイト配列を使用したいと思います。

配列データを互換性のある型 ( GetByteArrayElements )に変換 (コピー) するための JNI メソッドについて読みましたが、使用しているライブラリと互換性のないjbyte *型が残ります (ライブラリは独自のnByteを定義します)。タイプ、これは unsigned char です)。

このシナリオに最適なオプションは何ですか?

JNI を使用して説明した方法に固執し、jbyte 配列型を適切な nByte 配列に変換する必要がありますか? 他のオプションはありますか?

4

1 に答える 1

1

JNI を使用して説明した方法に固執し、jbyte配列型を適切なnByte配列に変換する必要がありますか?

はい、jbytenByteは型が異なるため、これが未定義の動作を引き起こさずに信頼できる唯一の方法のようです。実際には、 のサイズが のサイズとnByte同じである可能性が非常に高いため、 asjbyteのポインターを再解釈することでうまくいく可能性がありますが、これは移植可能な解決策ではありません。jbyte*nByte*

あなたのライブラリがint8_tを取り込んだ場合、話は違っていたでしょう。そうすれば、 のポインタを のポインタとして<cstdint>再解釈することができ、悪影響はありません。jbyteint8_t

于 2013-07-14T11:09:16.650 に答える