gpt4 book ai didi

android - 即使在 deleteLocalRef 之后,jni 表也会溢出

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:17:55 29 4
gpt4 key购买 nike

当我运行代码时,我得到一个错误“添加到 JNI 本地引用表失败有 512 个条目”

这是我的代码:

jstring pJNIData = pJNIEnv->NewStringUTF ( variables[0].GetStringValue() );

pJNIEnv->CallStaticVoidMethod ( pJNIActivityClass, pJNIMethodIDStartTime, pJNIData ) ;

pJNIEnv->DeleteLocalRef(pJNIData);

我已经阅读了一些建议,但没有一个有效!尽管有 DeleteLocalRef,它仍然无法工作。该函数在一个分析器中使用,该分析器从字面上调用所有函数...

最佳答案

我在 JNI 方法调用 Java 代码时看到过这种情况(在我的例子中,该方法不是静态的)。据我了解,当从 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 返回的每个对象都是“本地引用”。这意味着它在当前线程中的当前 native 方法的持续时间内有效。即使对象本身在本地方法返回后继续存在,引用也是无效的。这适用于 jobject 的所有子类,包括 jclass 和 jarray。 [...] 注意:方法和字段 ID 只是 32 位标识符,不是对象引用,不应传递给 NewGlobalRef。 GetStringUTFChars 和 GetByteArrayElements 等函数返回的原始数据指针也不是对象。

关于android - 即使在 deleteLocalRef 之后,jni 表也会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12088207/

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