2、Cocos2dx中的c++和java實現相互調用(高級篇)

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

本文目的android

要完成在cocos2dx的場景上一個點擊事件,傳遞一個消息到java層,下面讓咱們看看如何完成它。c++

包括git

你須要在你的項目中添加如下引用,原做者已經創建了一個在線項目。請確保在你的項目中包含文件了c++和Java,這裏有個連接你能夠查看一下:EasyNDKgithub

 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"), prms);
}

// 一個回調選擇器,native語言(java)將會調用它
void HelloWorld::SampleSelector(CCNode *sender, void *data)
{
    CCLog("Called from native environment");
}

// 析構函數移除掉HelloWorldSelectors中的選擇器(selectors)
HelloWorld::~HelloWorld()
{
    // 移除相關聯的選擇器,由於咱們將要銷燬當前實例
    NDKHelper::RemoveSelectorsInGroup("HelloWorldSelectors");
}

  

Java層面代碼:ui

 

/** 當activity第一次被建立調用*/
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // 在主activity中,設置這個activity做爲c++消息的接受者
    AndroidNDKHelper.SetNDKReciever(this);
}

//實現這個被c++發送消息調用的方法
//確保這個方法的名字跟c++傳遞過來的字符串相同
// 好比咱們從c++中傳遞"SampleSelector"字符串,這就是爲何咱們建立這個方法的緣由了
public void 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。其餘this

 

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

Sample Android Project.net

相關文章
相關標籤/搜索