gpt4 book ai didi

java - JNI 缓存的 jclass 全局引用变量被垃圾收集?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:06 25 4
gpt4 key购买 nike

我在 JNI 调用 API 中工作,从 C 调用 Java。我有一些前期初始化,可以将 30 多个 Java 类缓存到全局引用中。 FindClass 的结果被传递到 NewGlobalRef 以获取对该类的全局引用。我正在缓存这些类变量以便以后重用它们。我有 30 多个类的全局引用(以及 30 多个类构造函数的全局方法 ID)。

在下面的示例中,为了缩短代码片段,我删除了异常处理和 JNI 调用。我的工作代码在每次 JNI 调用后都会进行异常检查,并且我正在使用 -Xcheck:jni 运行。这是片段:

jclass aClass;
jclass bClass;

jmethodID aCtor;
jmethodID bCtor;

void getGlobalRef(const char* clazz, jclass* globalClass)
{
jclass local = (*jenv)->FindClass(jenv,clazz);
if (local)
{
*globalClass = (jclass) (*jenv)->NewGlobalRef(jenv,local);
(*jenv)->DeleteLocalRef(jenv,local);
}
}

methodID getMethodID(jclass clazz, const char* method, const char* sig)
{
return (*jenv)->GetMethodID(jenv,clazz,method,sig);
}

void initializeJNI()
{
getGlobalRef("MyProj/Testclass1", &aclass);
getGlobalRef("MyProj/Testclass2", &bclass);
.
.
aCtor = getMethodID(aclass,"<init>","()V");
bCtor = getMethodID(bclass,"<init>","(I)V");

}

initializeJNI() 函数设置 jclasses 的全局引用和构造函数的方法 ID,以及一些 jfieldID 和 C 数据结构的一些初始化。

初始化后,当我使用一些缓存的 jclasses 和 ctor jmethodIDs 调用 JNI 函数时,我从 -Xcheck:jni 报告了错误的全局或本地引用调用。

在 gdb 中,我在 initializeJNI() 的最后一行中断,并打印所有 jclasses 和 jmethodIDs 以及导致问题的那些看起来已经变成垃圾或垃圾收集(即 0x00 或 0x06)。是否可以对全局引用进行 gc 处理?

有什么建议吗?

最佳答案

糟糕!

已解决。 C 中的数据损坏。踩踏某些内存导致我缓存的 JNI 变量丢失。

没有 JNI 错误。

关于java - JNI 缓存的 jclass 全局引用变量被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2590411/

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