下面这个类由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
运行结果: