当Java通过JNI调用C函数时,我们知道任何对类或对象的本地引用在C函数返回到Java后可能会失效。
然而,当只有C调用Java时,并不存在“返回到Java”的情况。因此,我不清楚这些引用何时会失效。
例如,下面的代码是错误的,因为aClass和anObject可能在调用完成后失效。
然而,当只有C调用Java时,并不存在“返回到Java”的情况。因此,我不清楚这些引用何时会失效。
例如,下面的代码是错误的,因为aClass和anObject可能在调用完成后失效。
jclass aClass;
jobject anObject;
JNIEXPORT void JNICALL Java_example_method1(JNIEnv *env) {
aClass = env->FindClass("AClass");
}
JNIEXPORT void JNICALL Java_example_method2(JNIEnv * env) {
jmethodID constructor = env->GetMethodID( aClass, "<init>", "()V");
anObject = env->NewObject(klass, constructor );
}
然而在下面的例子中,是什么导致了 aClass
和 anObject
变得无效?只有对 DeleteLocalRef
的显式调用才会导致吗?
jclass aClass;
jobject anObject;
int main() {
JavaVMInitArgs vm_args;
JavaVMOption options[1];
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
options[0].optionString = "-Djava.class.path=.";
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_FALSE;
JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
aClass = env->FindClass("AClass");
jmethodID constructor = env->GetMethodID( aClass, "<init>", "()V");
anObject = env->NewObject(klass, constructor );
}
PushLocalFrame
/PopLocalFrame
对括号进行分组是一个好主意,它会自动清理生成的任何引用。 - technomage