標籤:cocos2d-x android jni
1、java調用c++
首先,在java中聲明相關方法
public static native void doLogin(String sid);public static native void doBindingSuc(String sid);
相關的調用方法如下:
public void login() {this.runOnUiThread(new Runnable() {public void run() {//下面部分為sdk提供的參數,可以不用管TYGame.login("F2", "L8", "6",bombEN4Android.this, new LoginResultListener() {@Overridepublic void loginSuccess(final String sid) {// TODO 登陸成功//myMessage.setText("登陸成功!\n" + sid);//Log.e("sid", sid);bombEN4Android.doLogin(sid); //調用c++方法}@Overridepublic void loginFail() {// TODO 登陸失敗//myMessage.setText("登陸失敗!");}});}});}public void doBinding(){this.runOnUiThread(new Runnable(){public void run() {TYGame.bindingAccount("F", "L8","6", bombEN4Android.this, new BindingAccountListener() {@Overridepublic void success(String sid) {//myMessage.setText("綁定成功!\n" + sid);bombEN4Android.doBindingSuc(sid); //調用c++方法}@Overridepublic void failure() {// TODO Auto-generated method stub//myMessage.setText("綁定失敗!");}});}});}
c++中相關方法的實現:
void Java_com_lmj_bombENAndroid_bombEN4Android_doLogin(JNIEnv *env, jobject thiz, jstring token) { const char *productStr = env->GetStringUTFChars(token, NULL); string nowToken = productStr; LocalPlayerModel::sharedLocalPlayerModel()->setUnionUid(ccs(nowToken)); CCNotificationCenter::sharedNotificationCenter()->postNotification(ZQYJ_LOGIN); env->ReleaseStringUTFChars(token, productStr); } void Java_com_lmj_bombENAndroid_bombEN4Android_doBindingSuc(JNIEnv *env, jobject thiz, jstring token) { CCNotificationCenter::sharedNotificationCenter()->postNotification(ZQYJ_LOGIN); const char *productStr = env->GetStringUTFChars(token, NULL); string nowToken = productStr; LocalPlayerModel::sharedLocalPlayerModel()->setUnionUid(ccs(nowToken)); LocalPlayerModel::sharedLocalPlayerModel()->doTyBounding(NULL); env->ReleaseStringUTFChars(token, productStr); //如果沒傳參數,那麼這個方法的內容可以為空白,不用釋放 }
2、c++調用java
c++中調用方法
方法的定義:
void payTY(CCString *productId,CCString *orderId,int serverId,CCString *playerId, CCString *playerName, int price, CCString *productName);
方法的實現:
void AndroidUtils::payTY(CCString *productId,CCString *orderId,int serverId,CCString *playerId, CCString *playerName, int price, CCString *productName){ JniMethodInfo minfo; string s="()L"+ANDROID_ACTIVITY_NAME+";"; bool isHave = JniHelper::getStaticMethodInfo(minfo,ANDROID_ACTIVITY_NAME.c_str(),"getInstance",s.c_str()); jobject jobj; if (isHave) { jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID); } isHave = JniHelper::getMethodInfo(minfo,ANDROID_ACTIVITY_NAME.c_str(),"pay","(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;)V"); if (isHave) { jstring str1 = minfo.env->NewStringUTF(productId->getCString()); jstring str2 = minfo.env->NewStringUTF(orderId->getCString()); jstring str3 = minfo.env->NewStringUTF(playerId->getCString()); jstring str4 = minfo.env->NewStringUTF(playerName->getCString()); jstring str5 = minfo.env->NewStringUTF(productName->getCString()); minfo.env->CallVoidMethod(jobj, minfo.methodID, str1,str2,serverId,str3,str4,price, str5); minfo.env->DeleteLocalRef(str1); minfo.env->DeleteLocalRef(str2); minfo.env->DeleteLocalRef(str3); minfo.env->DeleteLocalRef(str4); minfo.env->DeleteLocalRef(str5); }}其中,
static const string ANDROID_ACTIVITY_NAME="com/lmj/bombENAndroid/bombEN4Android";
調用了bombEN4Android.java中的pay方法。
java中的pay方法:
public void pay(final String productId, final String orderId, final int serverId, final String playerId, final String playerName, int price, final String productName){this.runOnUiThread(new Runnable(){public void run() {System.out.println("123");System.out.println(productName);System.out.println(orderId);System.out.println(playerId);System.out.println(playerName);System.out.println("456");String _playerName = null;String _productName = null;}});}
通過jni實現c++和java互調