上篇
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