У меня возникли проблемы с загрузкой статически скомпилированной библиотеки из Java с помощью System.loadLibrary (""), но я могу загрузить ее как динамически скомпилированную библиотеку (когда я ее создаю так). Я использую JDK 8, и я понимаю, что он может загружать статические библиотеки через System.loadLibrary (""), если вы предоставите JNI_OnLoad_L в файлах * .cpp и * .h.Загрузите статически скомпилированную библиотеку в 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;
}
У меня есть файл libkdu_jni.a в моем каталоге java.library.path, когда я пытаюсь запустить с компилируемой версией. Он отлично работает с файлом 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)
Я вынул .so файл, прежде чем пытаться загрузить файл .a.
Я не уверен, что я делаю неправильно. Я не думаю, что он даже видит файл 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 меняет ситуацию. –