在下面的代码中,我需要在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]);
}
提前谢了。
get/releasestringutfchars
必须始终成对调用,无论是否返回副本。
实际上,您几乎总是得到一个副本(至少在我检查的JVM实现中是这样的:OpenJDK和Dalvik),这样GC就可以自由地移动原始数组。它显然不能收集它,因为您有一个对字符串的引用,但它仍然会移动对象。
还有一个getStringCritical/ReleaseStringCritical
调用对,它将始终尝试返回指向原始数组的指针(尽管理论上它仍然可能返回副本)。这使它更快,但这是有代价的:在您释放数组之前,GC不能移动它。实际上,这通常是通过与GC建立互斥体来实现的,并为get
增加锁计数,为release
递减锁计数。这意味着这些也必须成对调用,否则锁计数将永远不会回到零,并且GC可能永远不会运行。请注意:get/releaseStringCritical
还附带了其他限制,这些限制与这个问题不太相关,但同样重要。