cocos2d-x通过jni实现c++和java互调

 

通过jni实现c++和java互调

标签: cocos2d-xandroidjni
  566人阅读  评论(0)  收藏  举报
  分类:
 

1、java调用c++ 

首先,在java中声明相关方法

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public static native void doLogin(String sid);  
  2.   
  3. public static native void doBindingSuc(String sid);  

相关的调用方法如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.     public void login() {  
  2.         this.runOnUiThread(new Runnable() {  
  3.             public void run() {  
  4.                 //下面部分为sdk提供的参数,可以不用管  
  5.                 TYGame.login("F2""L8""6",  
  6.                         bombEN4Android.thisnew LoginResultListener() {  
  7.   
  8.                             @Override  
  9.                             public void loginSuccess(final String sid) {  
  10.                                 // TODO 登陆成功  
  11. //                              myMessage.setText("登陆成功!\n" + sid);  
  12. //                              Log.e("sid", sid);  
  13.                                 bombEN4Android.doLogin(sid);  //调用c++方法  
  14.                             }  
  15.   
  16.                             @Override  
  17.                             public void loginFail() {  
  18.                                 // TODO 登陆失败  
  19. //                              myMessage.setText("登陆失败!");  
  20.                             }  
  21.                         });  
  22.                   
  23.             }  
  24.         });  
  25.           
  26.     }  
  27.       
  28.     public void doBinding()  
  29.     {  
  30.         this.runOnUiThread(new Runnable()  
  31.         {  
  32.             public void run() {  
  33.                 TYGame.bindingAccount("F""L8",  
  34.                         "6", bombEN4Android.thisnew BindingAccountListener() {  
  35.   
  36.                             @Override  
  37.                             public void success(String sid) {  
  38. //                              myMessage.setText("绑定成功!\n" + sid);  
  39.                                 bombEN4Android.doBindingSuc(sid);  //调用c++方法  
  40.                             }  
  41.   
  42.                             @Override  
  43.                             public void failure() {  
  44.                                 // TODO Auto-generated method stub  
  45. //                              myMessage.setText("绑定失败!");  
  46.                             }  
  47.                         });  
  48.               
  49.             }  
  50.         });  
  51.     }  

c++中相关方法的实现:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void Java_com_lmj_bombENAndroid_bombEN4Android_doLogin(JNIEnv *env, jobject thiz, jstring token)  
  2. {  
  3.     const char *productStr = env->GetStringUTFChars(token, NULL);  
  4.     string nowToken = productStr;  
  5.     LocalPlayerModel::sharedLocalPlayerModel()->setUnionUid(ccs(nowToken));  
  6.     CCNotificationCenter::sharedNotificationCenter()->postNotification(ZQYJ_LOGIN);  
  7.     env->ReleaseStringUTFChars(token, productStr);  
  8. }  
  9.   
  10. void Java_com_lmj_bombENAndroid_bombEN4Android_doBindingSuc(JNIEnv *env, jobject thiz, jstring token)  
  11. {  
  12.     
  13.     CCNotificationCenter::sharedNotificationCenter()->postNotification(ZQYJ_LOGIN);  
  14.     const char *productStr = env->GetStringUTFChars(token, NULL);  
  15.     string nowToken = productStr;  
  16.     LocalPlayerModel::sharedLocalPlayerModel()->setUnionUid(ccs(nowToken));  
  17.     LocalPlayerModel::sharedLocalPlayerModel()->doTyBounding(NULL);  
  18.   
  19.       
  20.     env->ReleaseStringUTFChars(token, productStr); //如果没传参数,那么这个方法的内容可以为空,不用释放  
  21.      
  22. }  

2、c++调用java

c++中调用方法

方法的定义:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void payTY(CCString *productId,CCString *orderId,int serverId,CCString *playerId, CCString *playerName,  int price, CCString *productName);  

方法的实现:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void AndroidUtils::payTY(CCString *productId,CCString *orderId,int serverId,CCString *playerId, CCString *playerName, int price, CCString *productName)  
  2. {  
  3.     JniMethodInfo minfo;  
  4.     string s="()L"+ANDROID_ACTIVITY_NAME+";";  
  5.     bool isHave = JniHelper::getStaticMethodInfo(minfo,ANDROID_ACTIVITY_NAME.c_str(),"getInstance",s.c_str());  
  6.     jobject jobj;  
  7.     if (isHave) {  
  8.         jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);  
  9.     }  
  10.     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");  
  11.     if (isHave) {  
  12.         jstring str1 = minfo.env->NewStringUTF(productId->getCString());  
  13.         jstring str2 = minfo.env->NewStringUTF(orderId->getCString());  
  14.         jstring str3 = minfo.env->NewStringUTF(playerId->getCString());  
  15.         jstring str4 = minfo.env->NewStringUTF(playerName->getCString());  
  16.         jstring str5 = minfo.env->NewStringUTF(productName->getCString());  
  17.           
  18.         minfo.env->CallVoidMethod(jobj, minfo.methodID, str1,str2,serverId,str3,str4,price, str5);  
  19.           
  20.         minfo.env->DeleteLocalRef(str1);  
  21.         minfo.env->DeleteLocalRef(str2);  
  22.         minfo.env->DeleteLocalRef(str3);  
  23.         minfo.env->DeleteLocalRef(str4);  
  24.         minfo.env->DeleteLocalRef(str5);  
  25.     }  
  26. }  
其中,
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static const string ANDROID_ACTIVITY_NAME="com/lmj/bombENAndroid/bombEN4Android";  

调用了bombEN4Android.java中的pay方法。

java中的pay方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void pay(final String productId,  final String orderId, final int serverId, final String playerId, final String playerName,  int price, final String productName)  
  2.     {  
  3.         this.runOnUiThread(new Runnable()  
  4.         {  
  5.             public void run() {  
  6.                 System.out.println("123");  
  7.                 System.out.println(productName);  
  8.                 System.out.println(orderId);  
  9.                 System.out.println(playerId);  
  10.                 System.out.println(playerName);  
  11.                 System.out.println("456");  
  12.                 String _playerName = null;  
  13.                 String _productName = null;  
  14.               
  15.             }  
  16.         });  
  17.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值