Kos*_*tis 2 c++ java java-native-interface
我正在使用JNI在Java中扩展我的API,以便通过C++访问它(我正在创建包装类).我在Java方面很有经验,但对C++来说却是新手.
现在,我在C++中为Java函数getString()创建一个包装器,它返回一个String.我正在使用GetStringUTFChars从Java String获取C字符串,但我不知道在哪里使用释放C字符串的ReleaseStringUTFChars.这是我的代码(aClass和aClassInstance是包装类中的私有日期成员):
const char* getString() {
jmethodID methodID = env->GetMethodID(aClass,
"methodName",
"()Ljava/lang/String;");
if (methodID == NULL) {
cout << "--methodID = NULL";
exit(0);
}
jstring jstringResult = (jstring) env->CallObjectMethod(aClassInstance, methodID);
const char* result = env->GetStringUTFChars(jstringResult, NULL);
// env->ReleaseStringUTFChars(jstringResult, result);
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果我删除//并使用ReleaseStringUTFChars,结果将被释放,我将无法再返回它,对吧?我应该在释放之前将结果复制到另一个char数组吗?
谢谢,欢迎任何帮助!
ķ
马赫什是对的
std::string getString()
{
jmethodID methodID = env->GetMethodID(aClass,
"methodName",
"()Ljava/lang/String;");
if (methodID == NULL)
{
cout << "--methodID = NULL";
exit(0);
}
jstring jstringResult = (jstring) env->CallObjectMethod(aClassInstance, methodID);
const char* result = env->GetStringUTFChars(jstringResult, NULL);
std::string result2(result);
env->ReleaseStringUTFChars(jstringResult, result);
return result2;
}
Run Code Online (Sandbox Code Playgroud)
std :: string会为您复制您的角色,并在需要时自动释放.在C++中使用原始指针通常是不受欢迎的.来自Java,您可能不太了解它们可能导致的问题.