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

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() {

							@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++中相关方法的实现:

    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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值