现在的位置: 首页 > 综合 > 正文

增量 差异 升级 jni ndk

2013年08月03日 ⁄ 综合 ⁄ 共 2113字 ⁄ 字号 评论关闭

做增量升级中遇到的各种问题

阅读一http://blog.csdn.net/hmg25/article/details/8100896

阅读二 http://blog.csdn.net/tibib/article/details/8538592

请先阅读以上两篇文章,本文所有使用文件都是从上面下载下来的,代码都是以第二篇的为主的

一.Jni

遇到最开始的问题就是编译so库的时候:

 

看了一些Jni的资料才知道Jni应该怎样使用

1.首先是新建工程,如果想尽可能少修改之前文章的代码,就按照他的路径建包,最后新建类,定义一个本地方法。

2.利用原始方法进行编译:

javac xx/xx/xx.java

javah xx/xx/xx

这样就生成了可以给c调用的.h头文件

二.Ndk

1.copy之前的代码,生成两个文件,Android.mkcom_hmg25_newstart_BSpatch.c,加上jni生成的com_hmg25_newstart_BSpatch.h文件,一起放在新建一个项目的JNI文件夹下,第一次编译

这个是因为没有引入bzlib的一些源码,到现在我也不知道具体都需要那个,就一股脑全都放在jni文件夹下了。

2.加上bzlib源码之后第二次编译


继续百度,http://blog.sina.com.cn/s/blog_5be1061c0100ykim.html这篇文章搞定,

解决问题:  android.mk中加入  LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

3.终于编成了

三.Android

1.随便建一个android demo项目进行测试,把NDK生成的libsobj文件夹copy到项目根目录,顺便把旧apkpatch文件push到虚拟机的sd卡中。

主方法静态读取库,然后再调用,

package com.example.testdiff;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {
	private String sdcard = Environment.getExternalStorageDirectory().toString();
	private String oldapk_filepath = sdcard + "/tmp/ha1.apk";
	private String newapk_savepath = sdcard + "/tmp/ha2.apk";
	private String patchpath = sdcard + "/tmp/1-2.patch";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.applyPatchToOldApk(oldapk_filepath, newapk_savepath, patchpath);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public native int applyPatchToOldApk(String oldapk_filepath, String newapk_savepath, String patchpath);
	
	static{
		System.loadLibrary("Bsdiff");
	}
}

运行,报错

这是我比较2,不知道应该按照jni生成目录去调用native方法,其实可以直接使用刚开始编译jni的那个项目进行测试。

2.目录

3.然后再主函数中调用BsdiffBusiness类的本地方法,实现则会去调用.so库中的c方法,运行

就会循环报:

找了好久,最后发现是没赋权限,一个非常低级却容易忽视的错误,AndroidManifest.xml中加入

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4.还有一些信息,具体不知道是做什么的 

http://blog.csdn.net/luhuajcdd/article/details/7750146

第三条,JNI_OnLoad是可以消除的,就是在c文件里面加上初始化方法,返回JNI版本就行

最终结果,成功在手机端生成了ha2.apk文件,对比和windows下生成的新文件,大小是一致的,高级的可能还要做下MD5验证什么的吧,我还不会....下一步就是搞出来怎么安装了


抱歉!评论已关闭.