Cocos2dx中Android部分的c++和java实现相互调用

要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看如何完成它。

包括

你需要在你的项目中添加以下引用,原作者已经建立了一个在线项目。请确保在你的项目中包含文件了c++和Java,这里有个链接你可以查看一下: EasyNDK

C++ 层面:

01#include "NDKHelper.h"
02 
03  // 在cocos2dx中的按钮点击方法
04  void   HelloWorld::menuCloseCallback(CCObject* pSender)
05  {
06      //注册一个selector,那么当我们的native环境(java环境)调用这个字符串名字的函数(此处为名字为SampleSelector的函    数)的时候,这个selector可以响应请求
07      //注意:设置组名是为了在析构函数中能够清除掉selector
08     NDKHelper::AddSelector( "HelloWorldSelectors" ,
09                            "SampleSelector" ,
10                            callfuncND_selector(HelloWorld::SampleSelector),
11                            this );
12 
13     // 为这个将要传递到native(也就是Java)语言中的消息设置参数
14     // 在c++中发送要调用的函数名
15     CCDictionary* prms = CCDictionary::create();
16     prms->setObject(CCString::create( "SampleSelector" ),  "to_be_called" );
17 
18     // 最后在当前环境(c++)中调用native方法
19     SendMessageWithParams(string( "SampleSelector" ), prms);
20}
21 
22// 一个回调选择器,native语言(java)将会调用它
23void   HelloWorld::SampleSelector(CCNode *sender,  void   *data)
24{
25     CCLog( "Called from native environment" );
26}
27 
28// 析构函数移除掉HelloWorldSelectors中的选择器(selectors)
29HelloWorld::~HelloWorld()
30{
31     // 移除相关联的选择器,因为我们将要销毁当前实例
32     NDKHelper::RemoveSelectorsInGroup( "HelloWorldSelectors" );
33}

Java层面代码:

01/** 当activity第一次被创建调用*/
02public   void   onCreate(Bundle savedInstanceState)
03{
04     super.onCreate(savedInstanceState);
05 
06     // 在主activity中,设置这个activity作为c++消息的接受者
07     AndroidNDKHelper.SetNDKReciever( this );
08}
09 
10//实现这个被c++发送消息调用的方法
11//确保这个方法的名字跟c++传递过来的字符串相同
12// 比如我们从c++中传递"SampleSelector"字符串,这就是为什么我们创建这个方法的原因了
13public   void   SampleSelector(JSONObject prms)
14{
15     Log.v( "SampleSelector" "传过来的参数是 : "   + prms.toString());
16 
17     String CPPFunctionToBeCalled = null;
18     try
19     {
20         CPPFunctionToBeCalled = prms.getString( "to_be_called" );
21     }
22     catch   (JSONException e)
23     {
24         // TODO Auto-generated catch block
25         e.printStackTrace();
26     }
27 
28     AlertDialog.Builder builder =  new   AlertDialog.Builder( this );
29     builder.setMessage( "这是一个android层中的popup" ).
30     setTitle( "Hello World!" ).
31     setNeutralButton( "OK" , null).show();
32 
33     // 发送带参数的消息,仅仅当selector列表中有这个相同名字的函数,c++才会接受这些消息,
34     AndroidNDKHelper.SendMessageWithParameters(CPPFunctionToBeCalled, null);
35}

记录

为了跟其他JavaSDK相连接,比如微博SDK,FaceBook SDK等,你可以按照这些sdk的java指导说明,实现这些消息,并传递接口到cocos2dx层面调用,使之成为你自己的SDK。在cocos2dx中。我已经通过这种方法实现了APPCircle,Flurry和很多其他的SDK。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值