[英]Error while calling non static java method from c++
我有與此類似的jni cpp類
JNIEXPORT void JNICALL Java_com_my_package_GameBridge_startGame(JNIEnv *env,
jobject obj))
{
GameBridge_Android gameBridge;
JavaVM* jvm;
int status = env->GetJavaVM(&jvm);
// global reference
jobject globalRef = env->NewGlobalRef(obj)
gameBridge.setCallback(globalRef);
gameBridge.startGame();
}
我正在嘗試將對jobject的引用存儲為全局引用,只要需要,我就可以在該對象上調用java方法。
我決定創建純c ++類-GameBridge_Android
C ++標頭與此類似
GameBridge_Android.h:
class GameBridge_Android : public GameBridge
{
public:
GameBridge_Android();
virtual void startGame();
virtual void restartGame();
virtual void pauseGame();
virtual void resumeGame();
virtual void setCallback(jobject obj);
protected:
jobject mCallback;
};
及其實現
GameBridge_Android.cpp:
void GameBridge_Android::restartGame(){//....}
void GameBridge_Android::resumeGame(){//....}
void GameBridge_Android::setCallback(jobject callback)
{
mCallback = callback;
}
void GameBridge_Android::pauseGame()
{
JavaVM* vm = JniHelper::getJavaVM();
JNIEnv* env;
jint rs = vm->AttachCurrentThread(&env, NULL);
jclass cls = env->FindClass("com/my/package/GameBridge");
jmethodID onPause = env->GetMethodID(cls, "onPause", "()V");
env->CallVoidMethod(mCallback, onPause);
}
和簡單的Java GameBridge類
public class GameBridge {
public native void startGame();
public void onPause() {
Log.d("JAVA_GameBridge", "onPause called ");
}
}
我遇到錯誤
art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: native code passing in reference to invalid global reference: 0x736c6576
04-08 16:33:57.889 25537-29355/com.my.package A/art﹕ art/runtime/check_jni.cc:65] in call to CallVoidMethodV
我試圖將jobject引用更改為全局引用,但是沒有成功(可能是我在這里做錯了)。但是,當我調用靜態java方法時,一切正常。
PS我不是C ++開發人員,因此對此部分的任何建議和更正將不勝感激。
首先,針對NULL檢查諸如FindClass()和GetMethodID()之類的調用的每個結果。 如果得到NULL,請使用諸如“ cerr ...”或“ fprintf(stderr,...)”之類的內容立即發出非常描述性的錯誤消息。
其次,距我嘗試做非常接近您正在做的事情已經有好幾年了,所以我不確定,但是我認為您不能引用傳遞給外部之外的本機非靜態方法調用的jobject傳遞給它的呼叫的上下文。 您可能需要使用NewGlobalRef()的全局引用。
JNI非常寬容。
這是將線程附加到JVM的另一種方法: 如何獲取異步調用的JNI接口指針(JNIEnv *)
我似乎記得那更像是我成功過的那個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.