1. MessageCenter.h
#ifndef __MESSAGECENTER_H__
#define __MESSAGECENTER_H__
#include <string>
#include <list>
struct lua_State;
class MessageCenter
{
public:
MessageCenter(void);
~MessageCenter(void);
static MessageCenter * getInstance();
static int lua_bind_AllFunction(lua_State* tolua_S);
void cppSendMessageToJava(const std::string & message);
void addMessageToList(const std::string &message);
const std::string luaGetMessageFromCpp();
static const std::string classPrefix;
static const std::string fullName;
static const std::string className;
private:
static MessageCenter *m_instance;
std::list<std::string> m_messageList;
};
int lua_cocos2dx_MessageCenter_getInstance(lua_State* tolua_S);
int lua_cocos2dx_MessageCenter_luaGetMessageFromCpp(lua_State* tolua_S);
int lua_cocos2dx_MessageCenter_cppSendMessageToJava(lua_State* tolua_S);
//void Java_org_cocos2dx_lua_AppActivity_javaSendMessageToCpp(JNIEnv env, jobject thiz, jstring msg)
#endif
2. MessageCenter.cpp
#include "MessageCenter.h"
#include "tolua_fix.h"
#include "LuaBasicConversions.h"
#include <stdlib.h>
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include <android/log.h>
#include "platform/android/jni/JniHelper.h"
#define LOG_TAG "MessageCenter"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#endif
using namespace cocos2d;
const std::string MessageCenter::classPrefix = "cp";
const std::string MessageCenter::className = "MessageCenter";
const std::string MessageCenter::fullName = classPrefix + "." + className;
MessageCenter *MessageCenter::m_instance = NULL;
MessageCenter::MessageCenter(void)
{
m_messageList.clear();
}
MessageCenter::~MessageCenter(void)
{
}
MessageCenter * MessageCenter::getInstance()
{
if (!m_instance){
m_instance = new MessageCenter();
}
return m_instance;
}
const std::string MessageCenter::luaGetMessageFromCpp()
{
if(!m_messageList.empty())
{
const std::string message = m_messageList.front();
m_messageList.pop_front();
return message;
}
return "0";
}
void MessageCenter::addMessageToList(const std::string &message)
{
m_messageList.push_back(message);
}
void MessageCenter::cppSendMessageToJava(const std::string & message)
{
CCLOG("sendMessageToJava:%s", message.c_str());
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo jmi;
JniHelper::getStaticMethodInfo(jmi, "org/cocos2dx/lua/AppActivity", "SendMessage", "(Ljava/lang/String;)V");
jstring str = (jmi.env->NewStringUTF(message.c_str()));
jmi.env->CallStaticVoidMethod(jmi.classID, jmi.methodID, str);
#endif
}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C"
{
void Java_org_cocos2dx_lua_AppActivity_javaSendMessageToCpp(JNIEnv env, jobject thiz, jstring msg)
{
std::string str = JniHelper::jstring2string(msg);
LOGD("javaSendMessageToCpp");
MessageCenter::getInstance()->addMessageToList(str);
}
}
#endif
//==============lua bind================
int MessageCenter::lua_bind_AllFunction(lua_State* tolua_S)
{
lua_getglobal(tolua_S, "_G");
if (lua_istable(tolua_S,-1))//stack:...,_G,
{
tolua_open(tolua_S);
tolua_module(tolua_S, classPrefix.c_str(), 0);
tolua_beginmodule(tolua_S, classPrefix.c_str());
tolua_usertype(tolua_S, MessageCenter::fullName.c_str());
tolua_cclass(tolua_S, className.c_str(), MessageCenter::fullName.c_str(),"",nullptr);
tolua_beginmodule(tolua_S, className.c_str());
tolua_function(tolua_S, "getInstance", lua_cocos2dx_MessageCenter_getInstance);
tolua_function(tolua_S, "cppSendMessageToJava", lua_cocos2dx_MessageCenter_cppSendMessageToJava);
tolua_function(tolua_S, "luaGetMessageFromCpp", lua_cocos2dx_MessageCenter_luaGetMessageFromCp