使用env的JNI->;return语句中的GetStringUTFChars() 我有一个JNICALL,我把一个JStand传递给C++,需要传递给C++函数,它给我一个值。 是否可以在return语句中调用GetStringUTFChars。我担心的是,我不能调用ReleaseStringUTFChars来释放内存 JNIEXPORT jint JNICALL Java_TestClass_getValue(JNIEnv *env, jobject obj, jstring name){ return t1->getValue(env->GetStringUTFChars(name, 0)); }

使用env的JNI->;return语句中的GetStringUTFChars() 我有一个JNICALL,我把一个JStand传递给C++,需要传递给C++函数,它给我一个值。 是否可以在return语句中调用GetStringUTFChars。我担心的是,我不能调用ReleaseStringUTFChars来释放内存 JNIEXPORT jint JNICALL Java_TestClass_getValue(JNIEnv *env, jobject obj, jstring name){ return t1->getValue(env->GetStringUTFChars(name, 0)); },java,c++,java-native-interface,Java,C++,Java Native Interface,它可以工作,但我不确定是否会出现内存泄漏或堆栈溢出 我看到的唯一其他选择是这样做: JNIEXPORT jint JNICALL Java_TestClass_getValue(JNIEnv *env, jobject obj, jstring name){ const char* nameChars = env->GetStringUTFChars(name, 0); env->ReleaseStringUTFChars(name, nameChars);

它可以工作,但我不确定是否会出现内存泄漏或堆栈溢出

我看到的唯一其他选择是这样做:

JNIEXPORT jint JNICALL Java_TestClass_getValue(JNIEnv *env, jobject obj, jstring name){
    const char* nameChars = env->GetStringUTFChars(name, 0);
    env->ReleaseStringUTFChars(name, nameChars);
    return t1->getValue(nameChars);
}
但这可能更糟。因为根据ReleaseStringUTFChars

通知VM本机代码不再需要访问utf

在我的例子中,访问
const char*nameChars
。 但当我需要传递
nameChars
时,我会尝试访问已经释放或即将释放的变量

我希望第一个版本是正确的。如果没有,你有什么建议?
即使没有声明变量,堆中的内存也会被分配吗?

关于
auto result=t1->getValue(nameChars)如何;env->ReleaseStringUTFChars(名称、名称字符);返回结果?或者编写一个helper类,从
jstring
获取数据,并在对象超出范围时释放数据。这就是RAII要解决的问题:RAII可以生成在任何情况下都安全的代码,但我认为问题是
GetStringUTFChars
是否返回,或者该机制是否适用于
字符常量*
。我不认为是这样,但我不能完全肯定;关于这一点,文档并不十分清楚。“我认为问题在于
GetStringUTFChars
是否返回本地或全局引用”。两个都不是
GetStringUTFChars
分配一些内存,将字符串内容复制到该内存(在此过程中执行UTF16到UTF8转换),并返回指向分配内存的指针
ReleaseStringUTFChars
调用该内存上的
free
,因此需要调用
ReleaseStringUTFChars