JNAは初めてです。私の1つのアプリケーションでは、 char * aarr = newchar[200]をcからjavaに返す必要があります。これを行う方法がわかりません。私のC++関数の戻り型は何である必要がありますか?そして、char配列を復活させるためにJavaメソッドをどのように宣言する必要がありますか?C++でchar[]値を取得するためにc++で参照によって変数を渡すような他の方法はありますか?
2 に答える
ネイティブ コードからバッファを返す場合はPointer
、さまざまなポインタ データ アクセス メソッドを使用してデータを取得/設定する必要があります (たとえば、Pointer.getByteArray()
および)。Pointer.setByteArray()
データがネイティブ コードによって割り当てられている場合は、メモリを破棄する何らかの方法を提供する必要があることに注意してください。そのため、後で破棄するためにネイティブ コードでポインターを保持するか、Java から ( としてPointer
)戻す必要があります。 C++ が適切なdelete[]
操作を実行できること。
Java 側からバッファを割り当てることができる場合 (Java 側でデータを広範囲に操作する必要がある場合に推奨)、直接を使用するByteBuffer
かMemory
、データが長寿命の場合はプリミティブ バイト配列を使用し、ネイティブ コードがアクセスする必要がある場合はプリミティブ バイト配列を使用します。ネイティブ コールの期間中。
char
JNA ドキュメントは、ネイティブが Java にマップされることを明確に示していますbyte
。
また、Java には符号付きの値しかないため、Java のbyte
値 (負の場合もある) をより大きな型 (short
またはint
) に変換し、上位ビットをマスクする必要があることに注意してください。
int data = (int)byteValue & 0xFF;
Pointer.getCharArray(long offset,int arraySize)
ポインタクラスのメソッドを使ってみてください。
あなたが印刷しているのは、デフォルトのエンコーディングを介して文字列に変換されたポインタの任意のメモリ位置だと思います。