通过JNI将我的Java API扩展到C++:如何包装返回String的方法?

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数组吗?

谢谢,欢迎任何帮助!

ķ

joh*_*ohn 5

马赫什是对的

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,您可能不太了解它们可能导致的问题.