Java/JNI - 在 JNI_OnLoad 中查找类时出现 UnsatisfiedLinkError

标签 java c java-native-interface

我有以下类(class):

NativeClass.java

public class NativeClass {

    public static final int CONSTANT_VALUE = getValue();

    public static native int getValue();

}

测试类.java

public class TestClass {

    public static void main(String[] args) {
        System.loadLibrary("native");
        System.out.println(NativeClass.CONSTANT_VALUE);
    }

}

C 代码:

#include <jni.h>

jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env = NULL;
    if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR;
    }
    (*env)->FindClass(env, "LNativeClass;");
    return JNI_VERSION_1_6;
}

JNIEXPORT jint JNICALL Java_NativeClass_getValue(JNIEnv *env, jclass cls) {
    return 5;
}

我编译的 C 文件是这样的:

gcc NativeClass.c -I"JNI_HEADER_PATH" -shared -fPIC -o libnative.so

然后像这样执行代码:

java -Djava.library.path=. TestClass

然后我得到以下异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: NativeClass.getValue()I

如果我将 System.loadLibrary("native"); 移动到 NativeClass 中的静态初始化程序 block ,它就可以正常工作:

public class NativeClass {

    static {
        System.loadLibrary("native");
    }

    public static final int CONSTANT_VALUE = getValue();

    public static native int getValue();

}

我在这里错过了什么? 此处的代码只是我在项目中遇到的确切错误的示例。 我绝对需要在 NativeClass 中声明常量,我还需要在 JNI_OnLoad 中找到该类,因为我必须在其中调用静态方法。

最佳答案

mainTestClass 的一部分,在加载 TestClass 之前无法调用。但是 TestClass 在调用 System.loadLibrary("native"); 之前无法加载。

所以这个

public static void main(String[] args) {
    System.loadLibrary("native");

永远不会被调用 - 调用 main 取决于正在加载的类,这取决于正在调用的 loadLibrary 而这取决于正在调用的 main 。 ...

关于Java/JNI - 在 JNI_OnLoad 中查找类时出现 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427845/

相关文章:

java - 如何通过java从一个大文件中读取并写入一个新文件

java - 如何从 JavaScript 调用 applet 方法

java - Android 应用索引集成

检查输入是否为C中的整数类型

java - 如何使用 Java 和 JNI 修改传递给 C++ 例程的原始数据的值?

Java 泛型和 JNI

java - 如何在应用程序中持续保持 5GB 内存,而不会因 GC 而导致性能不佳?

c - C语言中的fork()函数

c - C程序中的分支问题

java - C++实现的JNI和DLL文件之间如何传递参数