我有以下课程:
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中的静态初始化块,它就可以正常工作:
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。。。。

09-27 08:48