JNI链接静态库:无效的ELF标头

时间:2018-10-24 09:33:56

标签: java linux java-native-interface static-libraries

我正在尝试使用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出错。问题出在哪里?

1 个答案:

答案 0 :(得分:1)

That documentation并不建议loadLibrary可以加载静态库,而只能将本身与VM静态链接的动态(也称为共享库)加载。动态加载静态库是不可能的。参见static-libraries