作者:HU
转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037595.html
因为没用lua脚本写游戏,所以每次发布出去后,发现在bug,需要更新APK重新安装,严重影响体验,增加玩家流失率。如果使用直接更新.so文件的话,就可以解决这个问题。
1、下载.so文件,使用游戏本身的资源更新方法,下载下来,到文件的file/res目录
.so文件zip压缩一下会小很多,解压方法参考http://www.cnblogs.com/xioapingguo/p/4037323.html
2、把.so文件拷贝到 存放目录(根据自己喜好,不拷贝也可以),这里我将存到file/libs/目录中,把原来目录file/res中的libgame.so删除
文件拷贝方法:
public static void copyFile(File sourceFile,File targetFile)throws IOException{
if(!targetFile.exists()){
targetFile.getParentFile().mkdirs();
targetFile.createNewFile();
}
FileChannel fc1 = null;
FileChannel fc2 = null;
try
{
fc1 = new FileInputStream(sourceFile).getChannel();
fc2 = new FileOutputStream(targetFile).getChannel();
fc2.transferFrom(fc1, 0L, fc1.size());
}
finally
{
if(fc1!=null)
{
fc1.close();
}
if(fc2!=null)
{
fc2.close();
}
}
}
3、判断是否要重启游戏(.so文件更新后要重启游戏,因为下载资源是在之前的.so文件里执行的,如果想要不重启游戏,必须在java中做资源更新)
因为在小米系统中ALARM_SERVICE是不准的,所以重启有可能是不会成功,只要提示用户自己手动重启了,目前没有解决办法。
public static boolean isNeedRestratApplication() throws IOException
{
String str = sContext.getFilesDir()+"/libs/libgame.so";
File updateFile = new File(sContext.getFilesDir()+"/res/libgame.so");
Log.d(TAG, "str="+str);
if(updateFile.exists())//检查是否有更新
{
Log.d(TAG,"copyFile");
copyFile(updateFile,new File(str));//拷贝文件
updateFile.delete();//删除原来的文件
}
else
{
Log.d(TAG,"return");
return false;
}
//开始重启游戏
str = Cocos2dxHelper.getCocos2dxPackageName();
Intent localIntent = new Intent("android.intent.action.MAIN");
localIntent.addCategory("android.intent.category.LAUNCHER");
localIntent.setComponent(new ComponentName(str,"org.cocos2dx.cpp.AppActivity"));
localIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Context localContext = Cocos2dxActivity.getContext();
PendingIntent localPendingIntent = PendingIntent.getActivity(localContext, (int)System.currentTimeMillis(), localIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager localAlarmManager = (AlarmManager)localContext.getSystemService(android.content.Context.ALARM_SERVICE);
localAlarmManager.set(AlarmManager.RTC, 1000L+System.currentTimeMillis(), localPendingIntent);//延时1秒钟
Process.sendSignal(Process.myPid(),Process.SIGNAL_QUIT);
return true;
}
4、修改Cocos2dxActivity.java下,让游戏使用下载的.so文件运行游戏。(cocos2d-x 3.2下,其它版本按具体情况修改)
protected void onLoadNativeLibraries() {
try {
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String libName = bundle.getString("android.app.lib_name");
//System.loadLibrary(libName); File file = new File(getFilesDir().getAbsolutePath()+ "/libs/libgame.so");//下载到的.so文件,如果不存在,则使用原来安装时的
Log.d(TAG, "onLoadNativeLibraries =" + getFilesDir().getAbsolutePath()+ "libs/libgame.so"+" isexists="+file.exists());
if (file.exists()) {
try
{
System.load(file.getAbsolutePath());
}
catch(UnsatisfiedLinkError err)
{
Log.d(TAG, "onLoadNativeLibraries = fail");
}
} else {
System.loadLibrary(libName);
} } catch (Exception e) {
e.printStackTrace();
}
}
cocos2dx中android下动态更新.so文件的更多相关文章
-
【转载】cocos2dx 中 Android NDK 加载动态库的问题
原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...
-
Android下使用InputStream读取文件
在Android下使用InputStream读取文件. 如果不是从头开始读取文件,使用skip 后 在读取文件 使用read读取的长度为-1会获取不到数据. 换成RandomAccessFile 使用 ...
-
在Android中实现service动态更新UI界面
之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...
-
android中实现service动态更新UI界面
案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 注册BroadcastReceiver 在主程序activity中注册一个Bro ...
-
Android ListView动态更新数据
ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看 ...
-
【linux】linux下动态库so文件的一些认识
来源:http://mypyg.iteye.com/blog/845915 so其实就是shared object的意思.今天看了上面的博客,感觉好吃力.赶紧做个笔记记录一下.下面的内容大多都是连接中 ...
-
二、Cocos2dx中Android部分的c++和java实现相互调用(高级篇)
本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97 本文目的 要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看 ...
-
Gradle 载入中 Android 下一个.so档
1.在project下新建 jni/libs 目录 . jni 是和原来的libs 同级 ,将全部的.so文件放入 新建的libs文件下 2.在build.gradle 文件里新增下面内容到a ...
-
Android中res下anim和animator文件夹区别与总结
1.anim文件夹 anim文件夹下存放tween animation(补间动画)和frame animation(逐帧动画) 逐帧动画: ①在animation-list中使用item定义动画的全部 ...
随机推荐
-
华为手机浏览器不支持PUT提交方式的解决方案
最近所在技术团队在开发webapp项目,前端angularjs+后端.Net MVC API,API登录接口定义为PUT提交方式,在做兼容测试时发现UC.safari.微信浏览器下都可以登录,但在华为 ...
-
const int * p 和 int const * p 和 int * const p 的区别
首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...
-
linux 中 ‘|’的作用
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入.连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入 ...
-
JNA入门实例
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...
-
武汉科技大学ACM:1008: 明明的随机数
Problem Description 明明想在学校中请一些同学一起做一项问卷 调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个, ...
-
Mitsubish FX 3U PLC 串口 连接单元
前段时间遇到一个Mitsubish FX 3U PLC ,现将PLC连接单元分享一下,希望对其他人有所启示. unit PLC_MitsubishiFX; interface uses Windows ...
-
计算VMT的长度
function GetVirtualMethodCount(AClass: TClass): Integer; begin Result := (PInteger(Integer(AClass) + ...
-
关于通过id查询记录的一些总结
最近在做一个oa系统,简化了账号的设置,列名均为id,类型均为varchar:有的表将id设置成了主键,有的表没有设置成主键. 通过举例说明通过id查询的一些问题. 之前登陆的时候,账号001-007 ...
-
使用Nginx+CppCMS构建高效Web应用服务器
使用Nginx+CppCMS构建高效Web应用服务器 1:Why当前,越来越多的网站使用了各种框架,大部分框架使用了脚本语言.半编译语言等.比如Java.Python.Php.C#.NET等.这些框架 ...
-
chrome使用Timeline做性能分析
使用Timeline做性能分析 Timeline面板记录和分析了web应用运行时的所有活动情况,这是研究和查找性能问题的最佳途径.###Timeline面板概览 Timeline面板主要有三个部分构成 ...