3

JNAを使用して、C ++で記述されたdllをロードし、そのC++関数内に存在する関数を呼び出しています。

 int xxfunction(Char* ptr){...}

ここでは、関数がそれに値を割り当てるように、char配列を送信する必要があります。基本的に、char配列を参照で渡す必要があります。

JNAのドキュメントによるとchar*、Javaで同等のC ++はStringであるため、Stringオブジェクトを作成し、次のように関数に渡しました。

Java関数宣言:

interface foo extends Library
{
 ....//loading dll and other work
  int xxfunction(String chararray);//function declaration
}

Java関数呼び出し:

public static void main(String args[]) 
{
 String str="abcd";
 int i=fooinstance.xxfunction(str);//function call
}

しかし、私がこのコードを実行したとき、それは私に与えています:

Javaランタイム環境で致命的なエラーが検出されました:コアダンプの書き込みに失敗しました。ミニダンプは、クライアントバージョンのWindowsではデフォルトで有効になっていません

クラッシュは、ネイティブコードのJava仮想マシンの外部で発生しました。バグを報告する場所については、問題のあるフレームを参照してください。

それで、関数がcharポインタを期待する引数としてStringを渡すのは正しい方法ですか?Javaで同等のC++文字はバイトです。バイト配列をパラメーターとして渡す必要がありますか?

JNAから関数にポインタオブジェクトを渡すことすらできませんIllegalargumentException

4

1 に答える 1

4

Javaにのみconst char*マップする必要がありますString、でない可能性がある場合は、const代わりにバッファ(、、、またはNIOバッファ)を渡してbyte[]からMemoryNative.toString()「返された」値で使用する必要があります。

スタイルの問題として、バッファの上書きを回避するために十分な情報を利用できるように、提供されたバッファの長さを常に呼び出し先に提供する必要があります。

于 2012-12-06T18:10:49.307 に答える