android JNI java與C++互動篇(三)
阿新 • • 發佈:2019-01-03
整理來源:http://blog.csdn.net/qinning199/article/details/11750763
本文目的
要完成在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"
- }
- // 一個回撥選擇器,native語言(java)將會呼叫它
- void HelloWorld::SampleSelector(CCNode *sender, void *data)
- {
- CCLog("Called from native environment");
- }
- // 解構函式移除掉HelloWorldSelectors中的選擇器(selectors)
- HelloWorld::~HelloWorld()
- {
- // 移除相關聯的選擇器,因為我們將要銷燬當前例項
- NDKHelper::RemoveSelectorsInGroup("HelloWorldSelectors");
- }
Java層面程式碼:
- /** 當activity第一次被建立呼叫*/
- publicvoid onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- // 在主activity中,設定這個activity作為c++訊息的接受者
- AndroidNDKHelper.SetNDKReciever(this);
- }
- //實現這個被c++傳送訊息呼叫的方法
- //確保這個方法的名字跟c++傳遞過來的字串相同
- // 比如我們從c++中傳遞"SampleSelector"字串,這就是為什麼我們建立這個方法的原因了
- publicvoid 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);
- }
為了跟其他JavaSDK相連線,比如微博SDK,FaceBook SDK等,你可以按照這些sdk的java指導說明,實現這些訊息,並傳遞介面到cocos2dx層面呼叫,使之成為你自己的SDK。在cocos2dx中。我已經通過這種方法實現了APPCircle,Flurry和很多其他的SDK。其他
網上也有完整的原始碼樣例工程,下面是連結: