通過jni實現c++和java互調

來源:互聯網
上載者:User

標籤: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互調

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.