首页 > 代码库 > Cocos2d-x3.1下 Android,APK自动升级

Cocos2d-x3.1下 Android,APK自动升级

项目要做Android的自动升级,对于我们之前做iOS的转Cocos开发做Android方面的功能。。。。。

不对说了。这里记录下我的实现过程。

原文地址:http://blog.csdn.net/qqmcy/article/details/36713113

首先我们要先知道Cocos下Android有几个Activity,我推测是只有一个,如果不对的话请批评指正啊。

所以我们要在主Activity也就是AppActivity.java里面添加如下代码:

	static AppActivity activity  = null;//一定要静态对象
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		activity = this;
		
		
	}
	
	public static Object cppCall_logsth(String name)
	{

		return activity;
	
	}
	
	
	
	public void updateversion(String name)
	{
		Log.i("ddd", "开始更新");

		//下面三行就是Android更新APK的关键  name是apk的路径
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(new File(name)),
				"application/vnd.android.package-archive");
		activity.startActivity(intent);

	}

之后就是我们在cocos下用C++写了。

首先添加头文件

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "../../cocos2d/cocos/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++调用Android的代码。如果对NDK不熟,可以百度下C++和Android调用

//
//  
//  
//
//  Created by 杜甲 on 14-5-31.
//
//

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
        
        JniMethodInfo minfo;
        jobject jobj;
        bool b = JniHelper::getStaticMethodInfo(minfo,
                                                "org/cocos2dx/cpp/AppActivity",  //类路径
                                                "cppCall_logsth",   //静态方法名
                                                "(Ljava/lang/String;)Ljava/lang/Object;");   //括号里的是参数,后面的是返回值。
        
        if (!b) {
            LOGD("JniHelper::getMethodInfo error...");
        }else
        {
            std::string key = FileUtils::getInstance()->getWritablePath() + "update_mobile.apk";
            jstring jkey = minfo.env->NewStringUTF(key.c_str());
            jobj =   minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID,jkey);
            
        }
        
        
        b = JniHelper::getMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity",  //类路径
                                     "updateversion",   //静态方法名
                                     "(Ljava/lang/String;)V");   //括号里的是参数,后面的是返回值。
        if (!b) {
            LOGD("JniHelper::getMethodInfo error...");
        }else
        {
            std::string key = FileUtils::getInstance()->getWritablePath() + "apk安装包的名字";
            jstring jkey = minfo.env->NewStringUTF(key.c_str());
            minfo.env->CallVoidMethod(jobj, minfo.methodID,jkey);
            
        }
        
#endif

当然调用代码要写在apk下载完成之后,但为了减少篇幅所以下载代码请自行百度。

以上代码就能够实现apk自动更新。