簡體   English   中英

通過 JNI 將我的 Java API 擴展到 C++:如何包裝返回字符串的方法?

[英]Extending my Java API to C++ through JNI: How to wrap a method returning a String?

我正在使用 JNI 在 Java 中擴展我的 API,以便通過 C++ 訪問它(我正在創建包裝類)。 我在 Java 方面有經驗,但對 C++ 不熟悉。

現在,我正在用 C++ 為返回字符串的 Java 函數 getString() 創建一個包裝器。 我正在使用 GetStringUTFChars 從 Java 字符串中獲取 C 字符串,但我不知道在哪里使用 ReleaseStringUTFChars 來釋放 C 字符串。 這是我的代碼(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;
}

如果我刪除 // 並使用 ReleaseStringUTFChars,結果將被釋放並且我將不再能夠返回它,對嗎? 我應該在釋放結果之前將結果復制到另一個字符數組嗎?

謝謝,歡迎任何幫助!

馬赫什是對的

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 的您可能對它們可能導致的問題知之甚少。

調用ReleaseStringUTFChars最明顯的地方是在包裝類的析構函數中。 使用vector或其他容器記錄訪問的每個 jstring,然后在包裝類的析構函數中,對容器中的每個元素調用ReleaseStringUTFChars 如果您的客戶比包裝類對象存活時間更長,則他們需要制作角色數據的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM