gpt4 book ai didi

java - 通过 JNI : How to wrap a method returning a String? 将我的 Java API 扩展到 C++

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:16 25 4
gpt4 key购买 nike

我正在使用 JNI 在 Java 中扩展我的 API,以便通过 C++ 访问它(我正在创建包装类)。我在 Java 方面经验丰富,但对 C++ 不熟悉。

现在,我正在用 C++ 为返回字符串的 Java 函数 getString() 创建一个包装器。我正在使用 GetStringUTFChars 从 Java 字符串中获取 C 字符串,但我不知道在哪里使用 ReleaseStringUTFChars 来释放 C 字符串。这是我的代码(aClass 和 aClassInstance 是包装类中的私有(private)日期成员):

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;
}

如果我删除//并使用 ReleaseStringUTFChars,结果将被释放,我将无法再返回它,对吗?我应该在释放之前将结果复制到另一个字符数组吗?

谢谢,欢迎任何帮助!

K

最佳答案

马赫什是对的

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;
}

std::string 为您复制您的角色,并在需要时自动释放。通常不赞成在 C++ 中使用原始指针。来自 Java,您可能对它们可能导致的问题知之甚少。

关于java - 通过 JNI : How to wrap a method returning a String? 将我的 Java API 扩展到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7121297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com