GetStringUTFChars 和 ReleaseStringUTFChars 是如何工作的?
How GetStringUTFChars and ReleaseStringUTFChars works?
whosebug.com/questions/5859673 指出无论字符串是否被复制都必须调用 ReleaseStringUTFChars()
。那么 GetStringUTFChars()
中的参数 jboolean *isCopy
有什么用呢?
当原始jstring超出范围时,我可以释放C字符串吗?例如在这个伪代码中:
static const char *cstr;
JNIEXPORT void JNICALL Java_com_Run(JNIEnv *e, jobject obj, jstring s) {
cstr = (*e)->GetStringUTFChars(e, s, 0);
}
void cfunc() {
// Can I use and release the cstr here? How?
}
根据文档,如果我想在 JNI 调用完成后使用 java 对象,我必须通过 NewGlobalRef()
获取引用并稍后释放它。此规则对通过 GetStringUTFChars()
检索的字符串有效吗?
isCopy
参数 GetStringUTFChars()
只是试图提供与其他类似 JNI 函数一致的签名。在所有已知的 JVM 实现中,它总是总是 JNI_TRUE
,因为 Java 字符串在内部以不兼容的 UCS-16 格式存储。
但是,你仍然不能在不了解上下文的情况下发布cstr
。
whosebug.com/questions/5859673 指出无论字符串是否被复制都必须调用 ReleaseStringUTFChars()
。那么 GetStringUTFChars()
中的参数 jboolean *isCopy
有什么用呢?
当原始jstring超出范围时,我可以释放C字符串吗?例如在这个伪代码中:
static const char *cstr;
JNIEXPORT void JNICALL Java_com_Run(JNIEnv *e, jobject obj, jstring s) {
cstr = (*e)->GetStringUTFChars(e, s, 0);
}
void cfunc() {
// Can I use and release the cstr here? How?
}
根据文档,如果我想在 JNI 调用完成后使用 java 对象,我必须通过 NewGlobalRef()
获取引用并稍后释放它。此规则对通过 GetStringUTFChars()
检索的字符串有效吗?
isCopy
参数 GetStringUTFChars()
只是试图提供与其他类似 JNI 函数一致的签名。在所有已知的 JVM 实现中,它总是总是 JNI_TRUE
,因为 Java 字符串在内部以不兼容的 UCS-16 格式存储。
但是,你仍然不能在不了解上下文的情况下发布cstr
。