cocos2d-x通过jni实现c++和java互调
2016-02-09 11:25
489 查看
通过jni实现c++和java互调
标签: cocos2d-xandroidjni2015-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;
}
});
}
相关文章推荐
- cocos2d-x与安卓混编实现“更换头像”
- cocos2d-x3.2 的UserDefault
- Cocos2d-x 3.2在mac下android的环境配置
- cocos2d-x 帧动画创建一
- cocos2dx3.2 异步加载和动态加载
- cocos2dx3.0 超级马里奥开发笔记(一)——loadingbar、TableView和pageview的使用
- 【Cocos2d-x源码分析】 UserDefault如何保存本地数据
- 【玩转cocos2d-x之四十】怎样在Cocos2d-x 3.0中使用opengl shader?
- cocos2d-x 3.1 集成 云风pbc
- Cocos2d-x 常用特效 Effect API
- Cocos2d-x常用动作 Action API
- cocos2dx 3.3 AssetsManager测试更新
- cocos2d-x 3.0 新特性样例
- CocosCreator你又从新燃起我对Cocos的激情!
- CocosCreator你又从新燃起我对Cocos的激情!
- 如何使用cygwin去编译cocos2dx项目中的C++文件
- 关于cocos2dx的C++调用创建项目
- 每天一点点----项目中關鍵字 “ collectgarbage”
- 【COCOS CREATOR 系列教程之四】基于0.7.1先简单制作一个PAGEVIEW
- 【COCOS CREATOR 系列教程之三】PREFAB讲解&CC项目如何多开与分享