System.loadLibrary( "")を使用して静的にコンパイルされたライブラリをJavaからロードする際に問題がありますが、それを動的にコンパイルしたライブラリとしてロードできます。私はJDK 8を使用していますが、* .cppファイルと* .hファイルにJNI_OnLoad_Lを指定すると、System.loadLibrary( "")を介して静的ライブラリをロードできます。静的にコンパイルされたライブラリをJavaでロードする
マイkdu_jni.hがあります
extern "C"
JNIEXPORT jint JNICALL JNI_OnLoad_kdu_1jni(JavaVM *, void *);
マイkdu_jni.cppがあります
JNIEXPORT jint JNICALL JNI_OnLoad_kdu_1jni(JavaVM *vm, void *reserved)
{
return JNI_VERSION_1_8;
}
私が実行しようとすると、私は私がjava.library.pathディレクトリ内libkdu_jni.aファイルを持っていますコンパイルされたバージョンで。私はそれを動的にロードしようとすると、同じディレクトリ内のlibkdu_jni.soファイルで正常に動作しています。静的なファイル(libkdu_jni.a)をしようとすると、私が手:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no kdu_jni in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
私は.Aファイルをロードしようとする前の.soファイルを取り出しました。
私が間違っていることはわかりません。私はlibkdu_jni.aファイルのJNI_OnLoad_kdu_1jni()も見ているとは思えません。なぜなら、私はそこに例外を入れてしまい、それが投げられるのを見ていないからです。 JNI_OnLoad_kdu_jni()、JNI_OnLoad_kdu_1jni()、JNI_OnLoad()などいくつかの繰り返しを試みました。
アイデアはありますか?
JNI_OnLoad_kdu_1jniの定義は、 'extern" C "'で囲まれていますか?私が試みることを提案する唯一の他の事は、ライブラリをL.aのような単純なものに命名することです。 –
コンパイルされたライブラリを静的にロードすることはできません。それらを.soまたは.dllにリンクする必要があります。あなたの質問は理にかなっていません。 – EJP
@EJP Java8にはスタティックライブラリを読み込む機能が追加されました。私はあなたのようなコメントでチャイムしようとしていましたが、JEP 178は物事を変えます。 –