1. 程式人生 > >android JNI java與C++互動篇(三)

android JNI java與C++互動篇(三)

整理來源:http://blog.csdn.net/qinning199/article/details/11750763

本文目的

要完成在cocos2dx的場景上一個點選事件,傳遞一個訊息到java層,下面讓我們看看如何完成它。

包括

你需要在你的專案中新增以下引用,原作者已經建立了一個線上專案。請確保在你的專案中包含檔案了c++和Java,這裡有個連結你可以檢視一下:EasyNDK

 C++ 層面:

  1.  #include "NDKHelper.h" 
  2.  // 在cocos2dx中的按鈕點選方法
  3.  void HelloWorld::menuCloseCallback(CCObject* pSender)  
  4.  {  
  5.      //註冊一個selector,那麼當我們的native環境(java環境)呼叫這個字串名字的函式(此處為名字為SampleSelector的函    數)的時候,這個selector可以響應請求
  6.      //注意:設定組名是為了在解構函式中能夠清除掉selector
  7.     NDKHelper::AddSelector("HelloWorldSelectors",  
  8.                            "SampleSelector",  
  9.                            callfuncND_selector(HelloWorld::SampleSelector),  
  10.                            this);  
  11.     // 為這個將要傳遞到native(也就是Java)語言中的訊息設定引數
  12.     // 在c++中傳送要呼叫的函式名
  13.     CCDictionary* prms = CCDictionary::create();  
  14.     prms->setObject(CCString::create("SampleSelector"), "to_be_called");  
  15.     // 最後在當前環境(c++)中呼叫native方法
  16.     SendMessageWithParams(string("SampleSelector"
    ), prms);  
  17. }  
  18. // 一個回撥選擇器,native語言(java)將會呼叫它
  19. void HelloWorld::SampleSelector(CCNode *sender, void *data)  
  20. {  
  21.     CCLog("Called from native environment");  
  22. }  
  23. // 解構函式移除掉HelloWorldSelectors中的選擇器(selectors)
  24. HelloWorld::~HelloWorld()  
  25. {  
  26.     // 移除相關聯的選擇器,因為我們將要銷燬當前例項
  27.     NDKHelper::RemoveSelectorsInGroup("HelloWorldSelectors");  
  28. }  


Java層面程式碼:

  1. /** 當activity第一次被建立呼叫*/
  2. publicvoid onCreate(Bundle savedInstanceState)  
  3. {  
  4.     super.onCreate(savedInstanceState);  
  5.     // 在主activity中,設定這個activity作為c++訊息的接受者
  6.     AndroidNDKHelper.SetNDKReciever(this);  
  7. }  
  8. //實現這個被c++傳送訊息呼叫的方法
  9. //確保這個方法的名字跟c++傳遞過來的字串相同
  10. // 比如我們從c++中傳遞"SampleSelector"字串,這就是為什麼我們建立這個方法的原因了
  11. publicvoid SampleSelector(JSONObject prms)  
  12. {  
  13.     Log.v("SampleSelector""傳過來的引數是 : " + prms.toString());  
  14.     String CPPFunctionToBeCalled = null;  
  15.     try
  16.     {  
  17.         CPPFunctionToBeCalled = prms.getString("to_be_called");  
  18.     }  
  19.     catch (JSONException e)  
  20.     {  
  21.         // TODO Auto-generated catch block
  22.         e.printStackTrace();  
  23.     }  
  24.     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  25.     builder.setMessage("這是一個android層中的popup").  
  26.     setTitle("Hello World!").  
  27.     setNeutralButton("OK", null).show();  
  28.     // 傳送帶引數的訊息,僅僅當selector列表中有這個相同名字的函式,c++才會接受這些訊息,
  29.     AndroidNDKHelper.SendMessageWithParameters(CPPFunctionToBeCalled, null);  
  30. }  


為了跟其他JavaSDK相連線,比如微博SDK,FaceBook SDK等,你可以按照這些sdk的java指導說明,實現這些訊息,並傳遞介面到cocos2dx層面呼叫,使之成為你自己的SDK。在cocos2dx中。我已經通過這種方法實現了APPCircle,Flurry和很多其他的SDK。其他

網上也有完整的原始碼樣例工程,下面是連結: