Java 在静态初始值设定项中具有本机调用的JNI注册表项
我在使用JNI时遇到了一个有趣的问题。举个例子,我有一个如下的类:Java 在静态初始值设定项中具有本机调用的JNI注册表项,java,c,java-native-interface,Java,C,Java Native Interface,我在使用JNI时遇到了一个有趣的问题。举个例子,我有一个如下的类: public class AClass { private static int someInteger; public static native int getInteger(); static { someInteger = getInteger(); } } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *res
public class AClass {
private static int someInteger;
public static native int getInteger();
static {
someInteger = getInteger();
}
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env; (*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6);
JNINativeMethod table[] = {
{"getInteger", "()I", (void *) &native_getInteger)},
};
jclass cls = (*env)->FindClass(env, "AClass");
if ((*env)->ExceptionCheck(env)) {
(*env)->ExceptionDescribe(env);
return JNI_ERR;
}
printf("RegisterNatives return value: %d", (*env)->RegisterNatives(env, cls, table, 1));
return JNI_VERSION_1_6;
}
上述类的问题是,如果我有一个JNI库,它试图用JNI_OnLoad注册本地人,如下所示:
public class AClass {
private static int someInteger;
public static native int getInteger();
static {
someInteger = getInteger();
}
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env; (*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6);
JNINativeMethod table[] = {
{"getInteger", "()I", (void *) &native_getInteger)},
};
jclass cls = (*env)->FindClass(env, "AClass");
if ((*env)->ExceptionCheck(env)) {
(*env)->ExceptionDescribe(env);
return JNI_ERR;
}
printf("RegisterNatives return value: %d", (*env)->RegisterNatives(env, cls, table, 1));
return JNI_VERSION_1_6;
}
调用JNIEnv.FindClass
后,上述代码失败,因为FindClass
运行目标类的静态初始值设定项块。在这种情况下,目标类调用一个本机方法,该方法将仅在RegisterNatives
调用之后链接。这会导致不满意的链接错误
有没有一种方法可以在不运行目标类的静态初始值设定项块的情况下调用
JNIEnv.FindClass
来链接该类的本机方法?理想情况下,如果可能的话,我希望避免更改java代码。不可能对节中使用本机调用的类使用registernative。不可能对节中使用本机调用的类使用registernative。使用共享库,System.loadLibrary()
,以及由javah
生成的本机方法的常规命名,而不是RegisterNatives()
。是否有任何方法可以使用RegisterNatives进行命名,或者在这种情况下是不可能的?使用共享库System.loadLibrary()
,以及由javah
生成的本机方法的常规命名,有没有办法用registernations来代替registernations()
。或者在这种情况下是不可能的?