Cocos2dx的C++和Java的互相调用(EasyNDK)
2015-09-22 16:10
441 查看
本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97
本文目的
要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看如何完成它。
包括
你需要在你的项目中添加以下引用,原作者已经建立了一个在线项目。请确保在你的项目中包含文件了c++和Java,这里有个链接你可以查看一下:EasyNDK
C++ 层面:
#include "NDKHelper.h"
// 在cocos2dx中的按钮点击方法
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
//注册一个selector,那么当我们的native环境(java环境)调用这个字符串名字的函数(此处为名字为SampleSelector的函 数)的时候,这个selector可以响应请求
//注意:设置组名是为了在析构函数中能够清除掉selector
NDKHelper::AddSelector("HelloWorldSelectors",
"SampleSelector",
callfuncND_selector(HelloWorld::SampleSelector),
this);
// 为这个将要传递到native(也就是Java)语言中的消息设置参数
// 在c++中发送要调用的函数名
CCDictionary* prms = CCDictionary::create();
prms->setObject(CCString::create("SampleSelector"), "to_be_called");
// 最后在当前环境(c++)中调用native方法
SendMessageWithParams(string("SampleSelector"), prms);
}
// 一个回调选择器,native语言(java)将会调用它
void HelloWorld::SampleSelector(CCNode *sender, void *data)
{
CCLog("Called from native environment");
}
// 析构函数移除掉HelloWorldSelectors中的选择器(selectors)
HelloWorld::~HelloWorld()
{
// 移除相关联的选择器,因为我们将要销毁当前实例
NDKHelper::RemoveSelectorsInGroup("HelloWorldSelectors");
}Java层面代码:
/** 当activity第一次被创建调用*/
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 在主activity中,设置这个activity作为c++消息的接受者
AndroidNDKHelper.SetNDKReciever(this);
}
//实现这个被c++发送消息调用的方法
//确保这个方法的名字跟c++传递过来的字符串相同
// 比如我们从c++中传递"SampleSelector"字符串,这就是为什么我们创建这个方法的原因了
public void SampleSelector(JSONObject prms)
{
Log.v("SampleSelector", "传过来的参数是 : " + prms.toString());
String CPPFunctionToBeCalled = null;
try
{
CPPFunctionToBeCalled = prms.getString("to_be_called");
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("这是一个android层中的popup").
setTitle("Hello World!").
setNeutralButton("OK", null).show();
// 发送带参数的消息,仅仅当selector列表中有这个相同名字的函数,c++才会接受这些消息,
AndroidNDKHelper.SendMessageWithParameters(CPPFunctionToBeCalled, null);
}
本文目的
要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看如何完成它。
包括
你需要在你的项目中添加以下引用,原作者已经建立了一个在线项目。请确保在你的项目中包含文件了c++和Java,这里有个链接你可以查看一下:EasyNDK
C++ 层面:
#include "NDKHelper.h"
// 在cocos2dx中的按钮点击方法
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
//注册一个selector,那么当我们的native环境(java环境)调用这个字符串名字的函数(此处为名字为SampleSelector的函 数)的时候,这个selector可以响应请求
//注意:设置组名是为了在析构函数中能够清除掉selector
NDKHelper::AddSelector("HelloWorldSelectors",
"SampleSelector",
callfuncND_selector(HelloWorld::SampleSelector),
this);
// 为这个将要传递到native(也就是Java)语言中的消息设置参数
// 在c++中发送要调用的函数名
CCDictionary* prms = CCDictionary::create();
prms->setObject(CCString::create("SampleSelector"), "to_be_called");
// 最后在当前环境(c++)中调用native方法
SendMessageWithParams(string("SampleSelector"), prms);
}
// 一个回调选择器,native语言(java)将会调用它
void HelloWorld::SampleSelector(CCNode *sender, void *data)
{
CCLog("Called from native environment");
}
// 析构函数移除掉HelloWorldSelectors中的选择器(selectors)
HelloWorld::~HelloWorld()
{
// 移除相关联的选择器,因为我们将要销毁当前实例
NDKHelper::RemoveSelectorsInGroup("HelloWorldSelectors");
}Java层面代码:
/** 当activity第一次被创建调用*/
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 在主activity中,设置这个activity作为c++消息的接受者
AndroidNDKHelper.SetNDKReciever(this);
}
//实现这个被c++发送消息调用的方法
//确保这个方法的名字跟c++传递过来的字符串相同
// 比如我们从c++中传递"SampleSelector"字符串,这就是为什么我们创建这个方法的原因了
public void SampleSelector(JSONObject prms)
{
Log.v("SampleSelector", "传过来的参数是 : " + prms.toString());
String CPPFunctionToBeCalled = null;
try
{
CPPFunctionToBeCalled = prms.getString("to_be_called");
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("这是一个android层中的popup").
setTitle("Hello World!").
setNeutralButton("OK", null).show();
// 发送带参数的消息,仅仅当selector列表中有这个相同名字的函数,c++才会接受这些消息,
AndroidNDKHelper.SendMessageWithParameters(CPPFunctionToBeCalled, null);
}
相关文章推荐
- Cocos2d-x 3.x 异步加载资源和Loading界面
- cocos基础教程(9)声音和音效
- 怎么样cocos2d-x正在使用ECS(实体-包裹-制)建筑方法来开发一款游戏?
- cocos进阶教程(2)多分辨率支持策略和原理
- cocos基础教程(10)纹理缓存技术
- Quick3.5, CocosIDEV1.2.0调试lua代码
- cocos2dx 定时调度器的用法
- cocos2dx从其它Activity返回cocos界面出现黑块
- cocos2d0基础知识三个音符
- cocos动画
- Quick-cocos2d-x3.3 Study (二十)--------- 音乐音效
- Quick-cocos2d-x3.3 Study (十六)--------- 碰撞检测,事件监听,设置掩码
- cocos2d-x在Android.mk中自动添加Cpp
- [寒江孤叶丶的Cocos2d-x之旅_39]Cocos骨骼动画功能解密
- cocos2d-x 3.2 2048——第六部分(最后一章)
- Cocos3.8创建新工程,添加库工程
- cocos2dx 2.2 之触摸事件
- cocos2d-x3.0 windows 环境配置
- [cocos2dx注意事项009]试用quick-cocos2dx-2.2.4
- Cocos Studio study ---------- 使用CocosStudio1.6制作 界面,并结合代码制作游戏