I have jni cpp class similar to this
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();
}
I'm trying storing reference to jobject as a global reference and whenever I need I will be able to call java methods on that object.
I decided to create pure c++ class - GameBridge_Android
C++ header looks similar to this
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;
};
And its realization
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);
}
And simple java GameBridge class
public class GameBridge {
public native void startGame();
public void onPause() {
Log.d("JAVA_GameBridge", "onPause called ");
}
}
I'm getting an error
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
I've tried to change jobject reference to global reference but no success (probably I'm doing smth wrong here) However, when I invoke static java method, everything works perfectly ok.
P.S. I'm not C++ developer, so any suggestions and correction also on that part would be very appreciated.