当前位置: 首页 > 知识库问答 >
问题:

Java JNI GetStringUTFChars

丁茂
2023-03-14

在下面的代码中,我需要在for循环中调用ReleaseStringUTFChars还是只调用一次(使用任何一个const char*)?

#define array_size 10
const char* chr[array_size];
jboolean blnIsCopy;
for (int i = 0; i < array_size; i++) {
    chr[i] = env->GetStringUTFChars(myjstring, &blnIsCopy);
    printf((bool)blnIsCopy ? "true\n" : "false\n"); //displays always true
    printf("Address = %p\n\n",chr[i]); //displays different address
}

//ReleaseStringUTFChars with in a for loop or single statement is enough
for (int i = 0; i < array_size; i++) {
    env->ReleaseStringUTFChars(myjstring, chr[i]);
}

提前谢了。

共有1个答案

桂学
2023-03-14

get/releasestringutfchars必须始终成对调用,无论是否返回副本。

实际上,您几乎总是得到一个副本(至少在我检查的JVM实现中是这样的:OpenJDK和Dalvik),这样GC就可以自由地移动原始数组。它显然不能收集它,因为您有一个对字符串的引用,但它仍然会移动对象。

还有一个getStringCritical/ReleaseStringCritical调用对,它将始终尝试返回指向原始数组的指针(尽管理论上它仍然可能返回副本)。这使它更快,但这是有代价的:在您释放数组之前,GC不能移动它。实际上,这通常是通过与GC建立互斥体来实现的,并为get增加锁计数,为release递减锁计数。这意味着这些也必须成对调用,否则锁计数将永远不会回到零,并且GC可能永远不会运行。请注意:get/releaseStringCritical还附带了其他限制,这些限制与这个问题不太相关,但同样重要。

 类似资料:

相关问答

相关文章

相关阅读