Android ndk 如果我想返回从GetStringUTFChars获得的C sting,我应该使用ReleaseStringUTFChars吗?

Android ndk 如果我想返回从GetStringUTFChars获得的C sting,我应该使用ReleaseStringUTFChars吗?,android-ndk,java-native-interface,Android Ndk,Java Native Interface,您好,如上面的示例代码所示,我正在使用GetStringUTFChars填充nativeString。我需要将此nativeString返回到另一个本机调用函数 我必须使用ReleaseStringUTFChars()。如果我使用它,那么它不会释放内存,并且调用函数的nativeString值将无效 在其他堆栈溢出问题中,我没有清楚地得到这个答案。请提供帮助。GetStringUTFChars将为返回的字符串分配内存,而ReleaseStringUTFChars将释放该内存。因此,在使用完Get

您好,如上面的示例代码所示,我正在使用GetStringUTFChars填充nativeString。我需要将此nativeString返回到另一个本机调用函数

我必须使用ReleaseStringUTFChars()。如果我使用它,那么它不会释放内存,并且调用函数的nativeString值将无效


在其他堆栈溢出问题中,我没有清楚地得到这个答案。请提供帮助。

GetStringUTFChars
将为返回的字符串分配内存,而
ReleaseStringUTFChars
将释放该内存。因此,在使用完
GetStringUTFChars
返回的数据后,应该调用
ReleaseStringUTFChars

GetStringUTFChars
将为返回的字符串分配内存,而
ReleaseStringUTFChars
将释放该内存。因此,当您使用
GetStringUTFChars
返回的数据时,您应该调用
ReleaseStringUTFChars

是,但有一个问题,因为我正在将数据返回到调用函数。我没有完成这个实现的函数。char*getSomeString(JNIEnv*env,jstring jstr){char*retString;char*intermedString;intermedString=(*env)->GetStringUTFChars(env,jstr,NULL);retString=strdup(intermedString);(*env)->ReleaseStringUTFChars(env,jstr,intermedString);return retString;}你是说像那样吗,迈克尔。但是,在这种情况下,retString仍然在函数内部分配。如何释放它?最后使用它的人将不得不释放它。是的,但有一个问题,因为我正在将数据返回调用函数。我没有完成这个实现的函数。char*getSomeString(JNIEnv*env,jstring jstr){char*retString;char*intermedString;intermedString=(*env)->GetStringUTFChars(env,jstr,NULL);retString=strdup(intermedString);(*env)->ReleaseStringUTFChars(env,jstr,intermedString);return retString;}你是说像那样吗,迈克尔。但是,在这种情况下,retString仍然在函数内部分配。如何释放它?最后使用它的人必须释放它。是的,你必须释放缓冲区。处理此问题的最简单方法是返回std::string而不是char*是的,必须释放缓冲区。处理此问题的最简单方法是返回std::string而不是char*
jstring result = NULL;
**const char *nativeString = NULL;**

if (messageMe != NULL) {
    jstring jstrBuf = (envLocal)->NewStringUTF(value);
    result = (jstring) envLocal->CallStaticObjectMethod(g_clazz, messageMe,
            jstrBuf);
    **nativeString = envLocal->GetStringUTFChars(result, 0);**
    g_JavaVM->DetachCurrentThread();
    return nativeString;