【发布时间】:2011-02-05 03:11:44
【问题描述】:
我正在使用 JNI 调用 API,从 C 调用 Java。我进行了一些前期初始化以将 30 多个 Java 类缓存到全局引用中。 FindClass 的结果被传递到 NewGlobalRef 以获取对该类的全局引用。我正在缓存这些类变量以便以后重用它们。我有 30 多个对类的全局引用(以及 30 多个用于类构造函数的全局方法 ID)。
在以下示例中,为了缩短代码 sn-p,我删除了异常处理和 JNI 调用。我的工作代码在每次 JNI 调用后都会进行异常检查,并且我正在使用 -Xcheck:jni 运行。这是sn-p:
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 jmethodID 调用 JNI 函数时,我收到了从 -Xcheck:jni 报告的错误的全局或本地引用调用。
在 gdb 中,我在 initializeJNI() 的最后一行中断,并打印所有 jclasses 和 jmethodIDs,而导致问题的那些看起来已经变成垃圾或垃圾收集(即 0x00 或 0x06)。全局引用是否可以被 gc'ed?
有什么建议吗?
【问题讨论】:
-
已解决。 C 中的数据损坏。没有 JNI 错误。
标签: java c java-native-interface invocation