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
。