gpt4 book ai didi

java - 在静态初始化程序中使用 native 调用的 JNI RegisterNatives

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:06 25 4
gpt4 key购买 nike

我在使用 JNI 时遇到了一个有趣的问题。举个例子,我有一个类如下:

public class AClass {
private static int someInteger;

public static native int getInteger();

static {
someInteger = getInteger();
}
}

上述类的问题是,如果我有一个 JNI 库尝试使用 JNI_OnLoad 注册 native ,如下所示:

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 运行了目标类的静态初始化 block 。在这种情况下,目标类调用一个本地方法,该方法只会在 RegisterNatives 调用之后链接。这会导致 UnsatisfiedLinkError

有没有一种方法可以在不运行目标类的静态初始化程序 block 的情况下调用 JNIEnv.FindClass 以链接该类的 native 方法?理想情况下,我希望尽可能避免更改 Java 代码。

最佳答案

不可能将 RegisterNatives 与在部分中使用 native 调用的类一起使用。

关于java - 在静态初始化程序中使用 native 调用的 JNI RegisterNatives,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42475362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com