JNAを使用してJavaからアクセスするカスタムdllがあります。これまでのところ、すべてが完璧に機能しています。ただし、CコードからJavaクラスを作成したいと思います。これはJNAでは実行できないと思うので、私が行ったのはJNIメソッドを作成することですが、これによりUnsatisfiedLinkErrorが発生します。だから私の質問は:同じDLLにアクセスするときにJNAとJNIを混在させることはできますか?もしそうなら、どうすればそれを行うことができますか?
2 に答える
もちろん、DLL へのアクセスを混在させることはできます。とにかく DLL は 1 回しかロードされないからです。問題は、アプリケーションへのリンクがどのように機能するかです。
JNA:
JNA を使用する場合、jna ライブラリのネイティブ関数を呼び出します。これは、ある種のリフレクションによって、DLL 内の関数にバインドされます。これには、DLL 内の関数の名前について心配する必要がないという利点があります。関数は、規則に準拠する必要はありません。
JNI:
Java クラスから DLL で期待されるメソッド名へのマッピングによって単純に機能します。このシグネチャcom.company.SomeClass
を持つ関数を含むクラスがある場合:int doStuff(int i, long john)
JNIEXPORT jint JNICALL Java_SomeClass_doStuff(JNIEnv *env, jint i, jlong john) {
return ...whatever...
}
この関数が欠落している場合、UnsatisfiedLinkException が発生します。
解決:
独自の DLL を作成したように見えるので、ラッパー関数として必要な関数を追加するだけで完了です。関数シグネチャを取得するには、コマンドを使用してヘッダー ファイルを自動的に作成しますjavah
。
Advanced Programming for the Java 2 Platform - Chapter 5: JNI Technology を読むことをお勧めします。