无法使用 JNI 从 C++ 调用 到 Java
Can't make call from C++ To Java using JNI
我有一个关于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项目。你可能已经做了,但值得一试。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用