Cocos2dx中Android部分的c++和java實現相互調用

本文由qinning199原創,轉載請註明:http://www.cocos2dx.net/?p=97

本文目的

要完成在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)將會調用它
23 void HelloWorld::SampleSelector(CCNode *sender, void *data)
24 {
25     CCLog("Called from native environment");
26 }
27  
28 // 析構函數移除掉HelloWorldSelectors中的選擇器(selectors)
29 HelloWorld::~HelloWorld()
30 {
31     // 移除相關聯的選擇器,因爲我們將要銷燬當前實例
32     NDKHelper::RemoveSelectorsInGroup("HelloWorldSelectors");
33 }

Java層面代碼:

01 /** 當activity第一次被創建調用*/
02 public 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"字符串,這就是爲什麼我們創建這個方法的原因了
13 public 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。

網上也有完整的源代碼樣例工程,下面是鏈接:

Sample Android Project


發佈了53 篇原創文章 · 獲贊 4 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章