gpt4 book ai didi

Java JNI GetStringUTFChars

转载 作者:行者123 更新时间:2023-11-30 08:01:20 29 4
gpt4 key购买 nike

我正在学习 Java JNI 并试图理解 GetStringUTFChars 和 ReleaseStringUTFChars。我仍然无法理解 ReleaseStringUTFChars。根据我对某些文章的理解,在大多数情况下,GetStringUTFChars 返回对原始字符串数据的引用而不是副本。因此,实际上 ReleaseStringUTFChars 释放了 jstring 或 const char* (如果复制)或两者。

如果我得到以下问题的答案,我可以更好地理解。

在下面的代码中,我需要在 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 还附带其他限制,这些限制与此问题不太相关,但也同样重要。

关于Java JNI GetStringUTFChars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31872773/

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