本文由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。
網上也有完整的源代碼樣例工程,下面是鏈接: