我正在尝试使用JNI使用静态库。因此,我正在静态地编译我的库
g++ -c -std=c++11 -o jnitest_jnitest_App.o jnitest_jnitest_App.cpp -lOtherLib
然后打包
ar rcs jnitest_jnitest_App.a jnitest_jnitest_App.o
现在,当我尝试运行.jar
时,出现以下错误:
jnitest/jnitest_jnitest_App.a: invalid ELF header (Possible cause: endianness mismatch)
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2424)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2481)
at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2678)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2611)
at java.base/java.lang.Runtime.load0(Runtime.java:814)
at java.base/java.lang.System.load(System.java:1838)
at jnitest.jnitest.App.<clinit>(App.java:13)
我正在使用64位Linux Mint 19和Java 10(64位)
将本机代码编译为共享库不会使JNI出错。问题出在哪里?
答案 0 :(得分:1)
That documentation并不建议loadLibrary
可以加载静态库,而只能将本身与VM静态链接的动态(也称为共享库)加载。动态加载静态库是不可能的。参见static-libraries