在使用Cocos2dx進行Android開發的時候,有時候想在c++中使用java編寫的本地界面,並進行跳轉。
首先在Android中添加本地activity:
package org.cocos2dx.cpp;
import android.app.Activity;
import android.os.Bundle;
public class CocoActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
不要忘記在添加以下注冊activity的代碼:
<activity android:name="org.cocos2dx.cpp.CocoActivity"></activity>
本地有一個和Cocos2dx綁定的界面AppActivity:
在AppActivity中添加如下代碼:
public class AppActivity extends Cocos2dxActivity {
static AppActivity context;//聲明靜態變量代表本界面
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
context = this;//此處爲問題關鍵把本界面賦值給靜態變量,以便獲取本變量
}
/*本靜態方法用來獲取本界面*/
public static Object getCon() {
return context;
}
/*該非靜態方法用來進行頁面跳轉*/
public void startActivity() {
Intent intent = new Intent(this, Coco.class);
startActivity(intent);
}
}
以下是在c++中添加的代碼:
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,/*JniMethodInfo的引用*/
"org/cocos2dx/cpp/AppActivity",/*類的路徑*/
"getCon",/*函數名*/
"()Ljava/lang/Object;");/*函數類型簡寫*/
jobject activityObj;//調用靜態方法獲取要跳轉的界面的object
if (isHave) {
//CallStaticObjectMethod調用java函數,並把返回值賦值給activityObj
activityObj = minfo.env->CallStaticObjectMethod(minfo.classID,
minfo.methodID);
}
isHave = JniHelper::getMethodInfo(minfo,/*JniMethodInfo的引用*/
"org/cocos2dx/cpp/AppActivity",/*類的路徑*/
"startActivity",/*函數名*/
"()V");/*函數類型簡寫*/
if (isHave) {
//CallStaticObjectMethod調用java函數,並把返回值賦值給activityObj
minfo.env->CallVoidMethod(activityObj,
minfo.methodID);//通過獲取的object調用非靜態方法來進行界面跳轉
}