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

时间:2015-10-30 02:44:28

标签: java c java-native-interface

我有以下课程:

NativeClass.java

public class NativeClass {

    public static final int CONSTANT_VALUE = getValue();

    public static native int getValue();

}

TestClass.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中的静态初始化程序块,它可以正常工作:

public class NativeClass {

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

    public static final int CONSTANT_VALUE = getValue();

    public static native int getValue();

}

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

1 个答案:

答案 0 :(得分:0)

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

所以这个

public static void main(String[] args) {
    System.loadLibrary("native");
永远无法调用

- 调用main取决于正在加载的类,这取决于被调用的loadLibrary,这取决于被调用main ....