簡體   English   中英

從C ++調用非靜態Java方法時出錯

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

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