我正在尝试通过 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 位)
将 native 代码编译到共享库中不会出现 JNI 错误。问题出在哪里?
最佳答案
That documentation并不建议静态库可以通过 loadLibrary
加载,只有一个动态的(也称为共享库)本身已经与 VM 静态链接,它很可能是。动态加载静态库是不可能的。参见 static-libraries
关于java - JNI 链接静态库 : Invalid ELF header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52965629/