stackoverflow.com/questions/5859673指出,无论是否复制字符串,都必须调用ReleaseStringUTFChars()
。那么jboolean *isCopy
中的参数GetStringUTFChars()
有什么用呢?
当原始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
。