【cocos2d-x 手游研發小技巧(4)與Android混編實現換“頭像圖片”】


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類方法如下:

    public static Object gotoActivity()
    {
        Intent in = new Intent(zha_jin_hua.getContext(),
                UserInfoActivity.class);
        zha_jin_hua.getContext().startActivity(in);
        
        return null;
    }

這是一個靜態類;返回類型為Object,但是我不需要返回值,因為我執行頁面跳轉,那如果我的需求是獲取android模塊代碼的值,就可以填寫對應的返回類型,就可以進行java和c++的相互傳值;

在C++類的頭文件需要引入:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include <android/log.h>

#if 1
#define  LOG_TAG    "JniHelper"
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#else
#define  LOGD(...)
#endif

#endif

在c++類具體調用時需要如下執行:

void PersonLayer::onHeadTouched()
{
    CCLog("玩家點擊頭像換頭像了");
    BaseSoundControl::PlayEffectMusic(EFFECT_CLICK);
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    JniMethodInfo minfo;
    jobject jobj;
        //getStaticMethodInfo方法是調用靜態類的,也可以不用調用靜態類的getMethodInfo
        bool b = JniHelper::getStaticMethodInfo(minfo,
                                          "com.dcgame.zhajinhua.zha_jin_hua", //類路徑
                                          "gotoActivity", //靜態方法名
                                          "()Ljava/lang/Object;");//括號里的是參數,后面的是返回值。
        if(!b){
            CCLog("JniHelper::getMethodInfo error...");
        }else{
            CCLog("ready to invoke method...");
            jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
        }
    #endif
}

是這樣就可以調用Java代碼了,去執行了gotoActivity方法,這個方法是靜態的,所以用了getStaticMethodInfo,如果不是則用getMethodInfo

完成以上操作還沒完,因為我們調用的是android系統頭像,需要用到照相功能,所以還的開啟這個功能權限;

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

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <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

 ps:cocos2dx研發群(41131516


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM