我想調用下面的Java方法中的Android調用靜態JNI方法返回來自C++
public static String getLevelFile(String levelName) { /*body*/}
從C字符串++使用下面的JNI代碼
JniMethodInfoJavaApi methodInfo;
if (! getStaticMethodInfo(methodInfo, "getLevelFile", "(Ljava/lang/String;)Ljava/lang/String;"))
{
return std::string("");
}
LOGD("calling getLevelFile");
jstring returnString = (jstring) methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, levelName.c_str());
LOGD("returned from getLevelFile");
methodInfo.env->DeleteLocalRef(methodInfo.classID);
const char *js = methodInfo.env->GetStringUTFChars(returnString, NULL);
std::string cs(js);
methodInfo.env->ReleaseStringUTFChars(returnString, js);
LOGD("returning Level data");
應用崩潰時做CallStaticMethodObject()
。我通過使用javap
驗證了方法簽名是正確的。並且LOGD("calling getLevelFile");
打印正確,然後它崩潰。我可以做同一班的其他CallStaticVoidMethod()
,但不能這樣做。任何想法我做錯了什麼?
去過,因爲我用JNI,但我相當肯定,你不能傳遞c_str的'結果很長一段時間() '到一個Java方法,而是需要創建一個'jstring'來傳入。 –
是的。用'NewStringUTF'或'NewString'從MUTF-8或UTF-16創建字符串。 – fadden
謝謝@JoachimIsaksson。有效。如果你想把它作爲答案,我會很樂意標記爲正確的,並讚揚它。 – asloob