java - JNI 链接静态库 : Invalid ELF header

标签 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 位)

将 native 代码编译到共享库中不会出现 JNI 错误。问题出在哪里?

最佳答案

That documentation并不建议静态库可以通过 loadLibrary 加载,只有一个动态的(也称为共享库)本身已经与 VM 静态链接,它很可能是。动态加载静态库是不可能的。参见 static-libraries

关于java - JNI 链接静态库 : Invalid ELF header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52965629/

相关文章:

java - 灵活的jni项目

Java 小程序问题 : dll already loaded in another classloader

java - 无法选择 ListView 项目

java - 目录为空时 NLST 上的 FTP 超时

python - 导入错误:没有名为函数的模块

linux - 在 Shell 脚本中获取进程的 PID

java - Android P 预览版中的 INSTALL_FAILED_OLDER_SDK

java - 分数类不能应用于给定类型?

c++ - 使用 LD_PRELOAD 和 C++ 中的全局范围对象加载堆分析器

android - 如何处理 "JNI WARNING : 0x44f81e80 is not a valid JNI reference"