[英]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.