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

来源:互联网 发布:java入门视频百度网盘 编辑:程序博客网 时间:2024/04/30 13:43

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


0 0
原创粉丝点击