无法使用jni从c ++调用c ++
-
12-12-2019 - |
题
我有一个与cocos2d-x库的一个小项目。我正在尝试使用C ++来调用Java功能,但我在行中获得一个信号11例外:
// Get Status
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);
.
但我不知道为什么会发生这种情况。
在我的java class gessocial.java存在这个函数:
private void tweet() { String score = "123"; String tweetUrl = "https://twitter.com/intent/tweet?text=Hello ! I have just got " + score + " points in mygame for Android !!!!"; Uri uri = Uri.parse(tweetUrl); startActivity(new Intent(Intent.ACTION_VIEW, uri)); }.
此功能启动导航器发布推文。从java调用工作正常。
在我的c ++ interfacejni.h我有:
#ifndef __INTERFACE_JNI_H__ #define __INTERFACE_JNI_H__ #include "cocos2d.h" class InterfaceJNI { public: static void postMessageToFB(); static void postMessageToTweet(); protected: }; #endif // __INTERFACE_JNI_H__.
和InterfaceJni.cpp:
#include "InterfaceJNI.h" #include "platform/android/jni/JniHelper.h" #include jni.h > #include android/log.h > using namespace cocos2d; void InterfaceJNI::postMessageToTweet() { int status; JNIEnv *env; JavaVM *jvm; jmethodID mid; jclass mClass; bool isAttached = false; CCLog("Static postMessageToTweet"); // Get Status status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6); CCLog("Status: %d", status); if(status AttachCurrentThread(&env, NULL); CCLog("Status 2: %d", status); if(status GetStaticMethodID(mClass, "tweet", "()V"); CCLog("mID: %d", mid); if (mid!=0) env->CallStaticVoidMethod(mClass, mid); //----------------------------------------------------------- CCLog("Finish"); if(isAttached) jvm->DetachCurrentThread(); return; }.
此接口由代码的一部分使用:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) InterfaceJNI::postMessageToTweet(); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) ObjCCalls::trySendATweet(); #endif.
在JVM-> GetEnv上返回null指针((void **)和env,jni_version_1_6)上发生了什么;?
解决方案
看起来您的JVM变量为null或垃圾。Cocos2d-x的版本我使用的是一个名为jnihelper的类,静态:: getJavavm();您可能想要使用的方法。
JavaVM* vm = JniHelper::getJavaVM();
JNIEnv* env;
vm->GetEnv((void**)&env,JNI_VERSION_1_4); // mine uses JNI_VERSION_1_4
.
还,每次使用NDK构建时,请记住“刷新”Eclipse项目。你可能已经做了,但值得检查。
不隶属于 StackOverflow