cocos2d-x与安卓混编实现“更换头像”

来源:互联网 发布:淘宝如何投诉卖家店铺 编辑:程序博客网 时间:2024/05/05 04:49
 

Cocos2dx与安卓混编实现“更换头像”

标签: cocos2d-x安卓
 1601人阅读 评论(0) 收藏 举报
 分类:
 

cocos2dx在android平台上的游戏开发中往往会遇到一些混编需求,如:

比方有的社区类游戏需要用到更换玩家的“头像”操作,其实就是调用android servers服务里面的本地图片,以及选取,裁剪图片,裁剪完成往服务器上传图片功能,从而达到换用户头像的操作的功能;

那么用JniHelper 去调用 andriod java里面的类和方法实现混编就能满足我们操作android系统的各种需求:获取本机MAC地址,获取本机名称,甚至还可去操作android后台服务的复杂操作了;

言归正传,我们需要去写好android 的Activity类,这个类主要功能就是 调用android本地图片,选取,裁剪,裁剪玩往服务器上传图片;先看一下我的目录结构:

下面一个是我们游戏的入口主Cocos2dxActivity,上面一个UserInfoActivity.java则是我们真正需要去调用换头像功能的类;

他包含一个userinfo.xml layer 这方面是android开发的知识;

 

userinfo.xml视图文件的界面内容是这样的:

 

具体里面的代码我就不贴了,这里主要不是说怎么搞android开发,整个工程需要的文件图片,我都会上传,大家自取;

以上的UserInfoActivity.java类已经完全实现了上述功能,只需要在工程导入类就行;

ok,功能类实现了,那怎么进行C++调用java呢?,原理是在C++类里面用JniHelper去调用JAVA类里面的某个方法;

现在我想在我C++类里面去调用我游戏入口Cocos2dxActivity(zha_jin_hua.java)里面的一个方法,这个方法主要是执行android的页面跳转,跳转的我的功能类UserInfoActivity.java;

zha_jin_hua.java类方法如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static Object gotoActivity()  
  2.     {  
  3.         Intent in = new Intent(zha_jin_hua.getContext(),  
  4.                 UserInfoActivity.class);  
  5.         zha_jin_hua.getContext().startActivity(in);  
  6.           
  7.         return null;  
  8.     }  


这是一个静态类;返回类型为Object,但是我不需要返回值,因为我执行页面跳转,那如果我的需求是获取android模块代码的值,就可以填写对应的返回类型,就可以进行java和c++的相互传值;

在C++类的头文件需要引入:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  
  2. #include <jni.h>  
  3. #include "platform/android/jni/JniHelper.h"  
  4. #include <android/log.h>  
  5.   
  6. #if 1  
  7. #define  LOG_TAG    "JniHelper"  
  8. #define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)  
  9. #else  
  10. #define  LOGD(...)  
  11. #endif  
  12.   
  13. #endif  


在c++类具体调用时需要如下执行:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void PersonLayer::onHeadTouched()  
  2. {  
  3.     CCLog("玩家点击头像换头像了");  
  4.     BaseSoundControl::PlayEffectMusic(EFFECT_CLICK);  
  5.     #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  
  6.     JniMethodInfo minfo;  
  7.     jobject jobj;  
  8.         //getStaticMethodInfo方法是调用静态类的,也可以不用调用静态类的getMethodInfo  
  9.         bool b = JniHelper::getStaticMethodInfo(minfo,  
  10.                                           "com.dcgame.zhajinhua.zha_jin_hua"//类路径  
  11.                                           "gotoActivity"//静态方法名  
  12.                                           "()Ljava/lang/Object;");//括号里的是参数,后面的是返回值。  
  13.         if(!b){  
  14.             CCLog("JniHelper::getMethodInfo error...");  
  15.         }else{  
  16.             CCLog("ready to invoke method...");  
  17.             jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);  
  18.         }  
  19.     #endif  
  20. }  

是这样就可以调用Java代码了,去执行了gotoActivity方法,这个方法是静态的,所以用了getStaticMethodInfo,如果不是则用getMethodInfo

完成以上操作还没完,因为我们调用的是android系统头像,需要用到照相功能,所以还的开启这个功能权限;

在AndroidManifest.xml中添加如下代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <uses-permission android:name="android.permission.CAMERA" />  
  2. <uses-feature android:name="android.hardware.camera" />  
  3. <uses-feature android:name="android.hardware.camera.autofocus" />  
  4. <uses-permission android:name="android.permission.READ_LOGS"/>   

还有一个类,的activity的配置:

<activity android:name="com.xxx.xxxxx.UserInfoActivity"></activity>

ok,配置完成,就可以在android实现换头像操作了,效果如下:

 

 

相关图片资源,源码下载地址:

百度云:http://pan.baidu.com/share/link?shareid=1525180823&uk=4097703620&third=15    

0 0