无法使用 JNI 从 C++ 调用 到 Java

Can't make call from C++ To Java using JNI

本文关键字:C++ 调用 Java JNI      更新时间:2023-10-16

我有一个关于cocos2d-x库的小项目。我正试图使用C++来调用Java函数,但我在第11行得到了一个异常信号:

// Get Status
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);

但我不知道为什么会发生这种事。

在我的Java类Getsocial.Java中存在以下函数:

private void tweet(){字符串得分="123";字符串tweetUrl="https://twitter.com/intent/tweet?text=Hello!我刚刚在我的Android游戏中获得了"+分数+"分!!!!";Uri Uri=Uri.parse(tweetUrl);startActivity(new Intent(Intent.ACTION_VIEW,uri));}

此功能启动navigator以发布推文。从Java调用工作正常。

在我的C++接口JNI.h中,我有:

#ifndef __INTERFACE_JNI_H__#定义__INTERFACE_JNI_H__#包括"cocos2d.h"类接口JNI{公共:static void postMessageToFB();static void postMessageToTweet();受保护:};#endif//_INTERFACE_JNI_H__

在接口JNI.cpp:中

#include"接口JNI.h"#包括"platform/android/jni/JniHelper.h"#includejni.h>#includeandroid/log.h>使用名称空间cocos2d;void接口JNI::postMessageToTweet(){int状态;JNIEnv*env;JavaVM*jvm;jmethodID mid;jclass mClass;bool isAttached=false;CCLog("静态postMessageToTweet");//获取状态status=jvm->GetEnv((void**)&env,JNI_VERSION_1_6);CCLog("状态:%d",状态);if(status AttachCurrentThread(&env,NULL);CCLog("状态2:%d",状态);if(status GetStaticMethodID(mClass,"tweet","()V");CCLog("mID:%d",中间);if(mid!=0)env->CallStaticVoidMethod(mClass,mid);//-----------------------------------------------------------CCLog("完成面");if(已附加)jvm->DetachCurrentThread();回来}

此接口是从代码的一部分调用的,使用:

#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)接口JNI::postMessageToTweet();#elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)对象调用::trySendATweet();#endif

jvm上返回空指针的情况->GetEnv((void**)&env,JNI_VERSION_1_6)?

看起来jvm变量为null或垃圾。我使用的Cocos2D-x版本有一个名为JniHelper的类,该类带有static::getJavaVM();方法。

JavaVM* vm = JniHelper::getJavaVM();
JNIEnv* env;
vm->GetEnv((void**)&env,JNI_VERSION_1_4);  // mine uses JNI_VERSION_1_4

此外,每次使用NDK构建时,请记住"刷新"eclipse项目。你可能已经做了,但值得一试。