当我运行代码时,出现错误“无法添加到 JNI 本地引用表有 512 个条目”
这是我的代码:
jstring pJNIData = pJNIEnv->NewStringUTF ( variables[0].GetStringValue() );
pJNIEnv->CallStaticVoidMethod ( pJNIActivityClass, pJNIMethodIDStartTime, pJNIData ) ;
pJNIEnv->DeleteLocalRef(pJNIData);
我读过一些建议,但没有一个有效!尽管DeleteLocalRef
,它无法工作。该函数在分析器中使用,该分析器实际上调用所有函数......
当 JNI 方法调用 Java 代码时(在我的例子中,该方法不是静态的),我已经看到了这一点。据我了解,未使用的本地引用是not当从 JNI 调用 Java 方法时自动删除(我的意思是,直到顶级 JNI 函数返回)。
IIRC 要么日志中已有有关内存对象的信息,要么我可以添加一些日志记录;根据这些信息,我发现了我之前没有提到过的垃圾项目。它们是两个数组和一个类,在后续调用中创建,但不会被垃圾回收。
// in a function that calls a Java method from JNI
jbyteArray srcArray = env->NewByteArray(len);
jclass cls = env->FindClass("com/something/MyClass");
jmethodID mid = env->GetMethodID(cls, "mymethod", "([BI)[B");
jbyteArray resArray = (jbyteArray)env->CallObjectMethod(obj, mid, srcArray, XXXX);
...
env->DeleteLocalRef(cls);
env->DeleteLocalRef(resArray);
env->DeleteLocalRef(srcArray);
// no need to do anything with mid
请注意,尽管这三个本地引用的获取方式不同,但它们都存在。
有用的链接:http://www.netmite.com/android/mydroid/dalvik/docs/jni-tips.html#local_vs_global_references(或者找到 Dalvik VM 文档 dalvik/docs/jni-tips.html 并找到“本地与全局引用”部分)
JNI 返回的每个对象都是“本地引用”。这意味着它在当前线程中的当前本机方法的持续时间内有效。即使对象本身在本机方法返回后继续存在,引用也是无效的。这适用于 jobject 的所有子类,包括 jclass 和 jarray。 [...] 注意:方法和字段 ID 只是 32 位标识符,而不是对象引用,并且不应传递给 NewGlobalRef。 GetStringUTFChars 和 GetByteArrayElements 等函数返回的原始数据指针也不是对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)