java - 在 Java 中加载静态编译的库

标签 java c++ java-native-interface

我在使用 System.loadLibrary("") 从 Java 加载静态编译的库时遇到问题,但我可以将它作为动态编译的库加载(当我以这种方式构建它时)就好了。我正在使用 JDK 8,我的理解是如果您在 *.cpp 和 *.h 文件中提供 JNI_OnLoad_L,它可以通过 System.loadLibrary("") 加载静态库。

我的 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;
}

当我尝试使用编译版本运行时,我的 java.library.path 目录中有 libkdu_jni.a 文件。当我尝试动态加载它时,它与同一目录中的 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)

我在尝试加载 .a 文件之前取出了 .so 文件。

我不确定我做错了什么。我认为它甚至没有看到 libkdu_jni.a 文件的 JNI_OnLoad_kdu_1jni() 因为我在那里放了一个异常而且我没有看到它被抛出。我已经尝试对该名称进行多次迭代:JNI_OnLoad_kdu_jni()、JNI_OnLoad_kdu_1jni()、JNI_OnLoad() 等。

有什么想法吗?

最佳答案

my understanding is it can load static libraries via System.loadLibrary("") if you provide a JNI_OnLoad_L in the *.cpp and *.h files.

你的理解有误。您不能动态加载 .a 文件。它不能以任何方式或形式执行:

  • 未解决库内引用
  • 库外的引用也未解析:例如,C 库。

链接步骤是必不可少的,JVM 不会为您完成。您所阅读的内容适用于静态链接到 JVM 的库。

关于java - 在 Java 中加载静态编译的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39842117/

相关文章:

java - 我可以使用什么技术/方法在 J2EE 环境中热部署更改?

java - EasyMock - 匹配器与原始值混合?

c++ - 这个程序背后的逻辑是什么?

c++ - Qt 中 QMainWindow 上的深色透明层

java - 通过 datanucleus maven 插件使用来自单独模块的 JDO 持久类

java - 使用 Jetty Websocket 客户端设置 header

c++ - 在 C++ 中使用从 C 库返回的指针

java - 在 JNI 调用中调用 getFilesDir() 时出现 NullPointerException

Android Jni.so 文件 ExceptionInInitializerError 和 UnsatisfiedLinkError : Library jniopencv_core not found

java - jni无法正确接收包含 '\0'的jstring