cocos2d-x Jni c++ java互調 安全重新整理UI控制項最簡單例子(上)

來源:互聯網
上載者:User

上篇

Java調用c++,重新整理

首先我們先以引擎2.2.1為例子來建立一個TestJni的項目

建立方式如下:

-language cpp

http://blog.csdn.net/liuyuyefz/article/details/9129525

我們第一個目標是:通過java層來給C++層發送訊號,然後來讓我們的cocos2d-x的HelloWorld項目中的CCLabelTTF來改變顯示的內容。

請相信我這隻需要非常簡單的幾步操作。然後奇蹟就會降臨。


我們先來看看我們熟悉的cocos2d-x的c++代碼需要添加和修改些什麼。

CCLabelTTF * pLabel = CCLabelTTF::create("Hello World","Arial", 24);

這是建立一個Hello World的Label,也就是我們這次的主角。

我們想要在java處通過調用一個函數,來改變這個label的值。所以我們必須把pLabel重新定義為一個全域變數。

你需要把上面那段代碼替換成如下代碼

pLabel = CCLabelTTF::create("Hello World", "Arial", 24);


同時在 HelloWorldScene.h中的

public:

下添加如下代碼  

cocos2d::CCLabelTTF * pLabel ;



這個是用來改變pLabel中的顯示內容

std::string HelloWorld::changeStr =" ";//添加一個全域static變數表示狀態,來接收java傳過來的字串


void HelloWorld::changeText(float t)//添加一個方法來改變label的顯示內容

{

    if (HelloWorld::changeStr.compare(" ") !=0)//當java沒有傳內容過來的時候::changeStr 為空白

    {

        pLabel ->setString(HelloWorld::changeStr.c_str());

        HelloWorld::changeStr =" ";

    }

}

同時在 HelloWorldScene.h中的

public:

下添加如下代碼  

static std::string changeStr;

void changeText(float t);


到此處你可以試試看在

bool HelloWorld::init(){

....

}

函數中的最下面添加如下代碼,並且運行看看

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(HelloWorld::changeText),this, 0,false);//添加一個計時器,來動態每一幀檢測一下是java有傳文本過來。




#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include <jni.h>

extern

"C"

{

    void Java_org_cocos2dx_TestJni_TestJni_changeTTFLabel(JNIEnv*  env, jobject thiz,jstring textStr)

    {

        //這裡java調用changeTTFLabel("Test MyLabel Change!");,這裡就會被調用。jint

        const char* str;

        str = env->GetStringUTFChars(textStr, false);

        

        std::string tempStr(str);

        

        HelloWorld::changeStr = tempStr;

    }

}

#endif

第一部分:

我們來分布將講解以上代碼

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#endif

以上這段代碼是限定平台。這段代碼之間的代碼只有在編譯android項目的時候才會被調用到。因為調用ios項目的時候我們不能夠調用到這個之間的代碼,否則會編譯出錯通不過。

第二部分:


第三部分:

void Java_org_cocos2dx_TestJni_TestJni_changeTTFLabel(JNIEnv*  env, jobject thiz,jstring textStr)

這邊的格式規律為

Java_簽名(org_cocos2dx_TestJni_)_類名(TestJni)_changeTTFLabel(在該類下要調用的函數)

下面這一段的規律

(JNIEnv*  env, jobject thiz,jstring textStr)

前面兩個為必寫,最後jstring textStr為要傳的參數。

參數可以是jstring 或者 jint 他們分別對應了java的String 或者int類型

第四部分:

 const char* str;

        str = env->GetStringUTFChars(textStr, false);

jstring轉化為c++的 const char* 


在此c++部分的代碼我們已經全部完成。





在進入這個步驟之前你要先配置好所有eclipse下編譯cocos2dx android環境。

參考這篇文章:http://blog.csdn.net/jackystudio/article/details/12419387




然後在

public class TestJniextends Cocos2dxActivity{

......

}

函數中最下面添加如下代碼。

private static native void changeTTFLabel(String textStr);//這個是作為中介介面,提供java調用c++裡面的同名JNI函數的。



最後在

 protected void onCreate(Bundle savedInstanceState){

......

}

函數中最下面添加如下代碼。調用

changeTTFLabel("Test MyLabel Change!");




c++代碼的編譯

我們先進入

cocos2d-x2.2.0/projects/TestJni/proj.android

檔案夾下面,編譯

build_native.sh

的shell指令碼來編譯c++

windows下你需要有cywin來類比linux環境

mac下面直接

./build_native.sh即可。編譯成功大致為如下畫面。如果編譯結果中有erro,你要注意查看說明來看看c++什麼地方出錯了。





然後在eclipse裡面編譯android的java部分


方法是eclipse-》clean



最後連上真機:調試看結果label被從Hello World改變為Test MyLabel Change!



接下篇:http://blog.csdn.net/liuyuyefz/article/details/17758809

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.