gpt4 book ai didi

java - 在 JNI 中正确使用 DeleteLocalRef

转载 作者:行者123 更新时间:2023-11-29 21:42:48 32 4
gpt4 key购买 nike

这是示例 jni 方法,我在其中创建了一个字符串并将其返回给调用 java 方法:

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
char test[100];
sprintf(test, "Test%03d.txt", rand()/100);
jstring returnVal = (*env)->NewStringUTF(env, test);
(*env)->DeleteLocalRef(env,returnVal);
return returnVal;
}

我原以为 jstring 在调用 java 方法中无效,因为我删除了本地引用。但引用仍然有效。我明确地调用了 System.gc() 来查看 GC 是否清除了它,但它并没有发生。

根据这个:http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html

"Bug: Calling DeleteLocalRef() and continuing to use the deleted reference
It shouldn’t need to be said that it’s illegal to continue to use a reference after calling DeleteLocalRef() on it, but because it used to work, so you may have made this mistake and not realized. The usual pattern seems to be where native code has a long-running loop, and developers try to clean up every single local reference as they go to avoid hitting the local reference limit, but they accidentally also delete the reference they want to use as a return value!

The fix is trivial: don’t call DeleteLocalRef() on a reference you’re going to use (where “use” includes “return”)."

我对这种不一致感到有点困惑。

最佳答案

您的目标 SDK 级别是什么?如果您的目标是 13 或更低(ICS 之前),那么您会得到旧的 JNI 行为并且此代码应该可以工作(尽管它在技术上仍然是不正确的)

如果您的目标是 14 (ICS) 或更高,那么显示的代码将失败并出现赠品错误:

memory map fault addr deadd00d

请注意,如果您以 SDK 14+ 为目标,但在较早版本的 Android 上运行该应用,该代码也将有效

关于java - 在 JNI 中正确使用 DeleteLocalRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659867/

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