您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d C++中调用Java方法

2017-09-27 16:54 405 查看
下面这个类由C++调用, 显示提示框

/**
* 这个类由C++调用
* @author skymr
*
*/
public class JavaCall {

/**
* 显示提示框
* @param content 提示内容
*/
public static void showAlert(String content){
Log.d("aaaa", content);
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("content", content);
bundle.putString("type", "1");
msg.setData(bundle);
AppActivity.HANDLER.sendMessage(msg);
}
}

因为C++调用 Java的执行线程不在主线程中,所以由Handler传递消息到主线程,由它来处理这个消息并显示 
Handler在AppActivity中声明的

public static Handler HANDLER = null;
private static Context CONTEXT = null;
static{
HANDLER = new Handler(){
@Override
public void handleMessage(Message msg) {
Bundle data = msg.getData();
String type = data.getString("type");
if("1".equals(type)){
String content = data.getString("content");
Toast.makeText(CONTEXT, content, Toast.LENGTH_SHORT).show();
}
}

};
}

public AppActivity(){
CONTEXT = this;
System.out.println("aaaaaaaaaaaaaaaaaaaaaa");
}

C++部分, 注意要引入头文件 #include "platform/android/jni/JniHelper.h"




#ifndef __HELLO__
#define __HELLO__
#include "cocos2d.h"
#include "scripting/lua-bindings/manual/CCLuaEngine.h"
#include "platform/android/jni/JniHelper.h"
namespace cocos2d
{
class Hello: public Ref
{
public:
virtual bool init(){
return true;
}
CREATE_FUNC(Hello);
//调用java方法
virtual void callJavaFunc(){
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/skymr/learn/JavaCall","showAlert","(Ljava/lang/String;)V");
if (isHave){
jstring jstr = minfo.env->NewStringUTF("c++ call java");
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,jstr,2000);
minfo.env->DeleteLocalRef(minfo.classID);
}
else{
CCLOG("func is not exited...");
}
};
void sayHello(){
log("Hello Cocos Lua...");
//调用java方法
callJavaFunc();
callLuaFunc();
}
virtual void callLuaFunc(){
auto engine = LuaEngine::getInstance();
engine->executeScriptFile("test.lua");
};
Hello(){};
~Hello(){};

};
};
#endif

运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: