C++ Can';不要从C+打电话+;使用JNI访问Java
我有一个关于cocos2d-x库的小项目。我尝试用C++调用java函数,但是我在线路上得到了一个信号11异常:C++ Can';不要从C+打电话+;使用JNI访问Java,c++,java-native-interface,cocos2d-x,C++,Java Native Interface,Cocos2d X,我有一个关于cocos2d-x库的小项目。我尝试用C++调用java函数,但是我在线路上得到了一个信号11异常: // Get Status status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6); 但我不知道为什么会这样 在我的Java类Getsocial.Java中,存在以下函数: private void tweet() { String score = "123"; String
// Get Status
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);
但我不知道为什么会这样
在我的Java类Getsocial.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));
}
私有void tweet()
{
字符串分数=“123”;
字符串tweetUrl=”https://twitter.com/intent/tweet?text=Hello !在我的Android游戏中,我刚刚获得“+分数+”分!!!!”;
Uri=Uri.parse(tweetUrl);
startActivity(新意图(Intent.ACTION_视图,uri));
}
此函数用于启动navigator以发布推文。从Java调用可以很好地工作
<我的C++接口F.E.I。我有:
#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__
#ifndef接口JNI H__
#定义接口__
#包括“cocos2d.h”
类接口JNI
{
公众:
静态void postMessageOfB();
静态void postMessageToTweet();
受保护的:
};
#endif/\uu接口\u JNI\u 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;
}
#包括“InterfaceJNI.h”
#包括“platform/android/jni/JniHelper.h”
#包括jni.h>
#包括android/log.h>
使用名称空间cocos2d;
void InterfaceJNI::postMessageToTweet()
{
智力状态;
JNIEnv*env;
JavaVM*jvm;
jmethodidemid;
jclass-mClass;
bool isAttached=false;
CCLog(“静态postMessageToTweet”);
//获得地位
status=jvm->GetEnv((void**)和env,JNI\u版本1\u 6);
CCLog(“状态:%d”,状态);
if(状态AttachCurrentThread(&env,NULL);
CCLog(“状态2:%d”,状态);
if(status GetStaticMethodID(mClass,“tweet”和“()V”);
CCLog(“mID:%d”,mID);
如果(中间!=0)
env->CallStaticVoidMethod(mClass,mid);
//-----------------------------------------------------------
CCLog(“饰面”);
如果(已附加)
jvm->DetachCurrentThread();
返回;
}
使用以下命令从部分代码调用此接口:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
InterfaceJNI::postMessageToTweet();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
ObjCCalls::trySendATweet();
#endif
#如果(CC_目标_平台==CC_平台_ANDROID)
InterfaceJNI::postMessageToTweet();
#elif(CC_目标_平台==CC_平台_IOS)
ObjCCalls::trySendATweet();
#恩迪夫
在jvm->GetEnv((void**)&env,JNI_VERSION_1_6)上返回空指针会发生什么情况?看起来您的jvm变量是空的或垃圾。我使用的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项目。您可能已经“刷新”了,但值得检查。这项工作启动该功能很好,现在再次失败,但谢谢!