您的位置:首页 > 移动开发 > Cocos引擎

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

2016-02-09 11:25 489 查看
 


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

标签: cocos2d-xandroidjni
2015-03-17 18:53 566人阅读 评论(0) 收藏 举报


 分类:
 

Cocos2d-x学习笔记(30) 


版权声明:本文为博主原创文章,未经博主允许不得转载。

1、java调用c++ 

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

[cpp] view
plain copy

 





public static native void doLogin(String sid);  

  

public static native void doBindingSuc(String sid);  

相关的调用方法如下:

[java] view
plain copy

 





    public void login() {  

        this.runOnUiThread(new Runnable() {  

            public void run() {  

                //下面部分为sdk提供的参数,可以不用管  

                TYGame.login("F2", "L8", "6",  

                        bombEN4Android.this, new LoginResultListener() {  

  

                            @Override  

                            public void loginSuccess(final String sid) {  

                                // TODO 登陆成功  

//                              myMessage.setText("登陆成功!\n" + sid);  

//                              Log.e("sid", sid);  

                                bombEN4Android.doLogin(sid);  //调用c++方法  

                            }  

  

                            @Override  

                            public void loginFail() {  

                                // TODO 登陆失败  

//                              myMessage.setText("登陆失败!");  

                            }  

                        });  

                  

            }  

        });  

          

    }  

      

    public void doBinding()  

    {  

        this.runOnUiThread(new Runnable()  

        {  

            public void run() {  

                TYGame.bindingAccount("F", "L8",  

                        "6", bombEN4Android.this, new BindingAccountListener() {  

  

                            @Override  

                            public void success(String sid) {  

//                              myMessage.setText("绑定成功!\n" + sid);  

                                bombEN4Android.doBindingSuc(sid);  //调用c++方法  

                            }  

  

                            @Override  

                            public void failure() {  

                                // TODO Auto-generated method stub  

//                              myMessage.setText("绑定失败!");  

                            }  

                        });  

              

            }  

        });  

    }  

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

[cpp] view
plain copy

 





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++中调用方法

方法的定义:

[cpp] view
plain copy

 





void payTY(CCString *productId,CCString *orderId,int serverId,CCString *playerId, CCString *playerName,  int price, CCString *productName);  

方法的实现:

[cpp] view
plain copy

 





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);  

    }  

}  

其中,

[cpp] view
plain copy

 





static const string ANDROID_ACTIVITY_NAME="com/lmj/bombENAndroid/bombEN4Android";  

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

java中的pay方法:

[java] view
plain copy

 





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;  

              

            }  

        });  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: