一.生成.h文件
1.在android项目中新建jni的工具类
package com.appmartket.patch;
public class JniClient { static { System.loadLibrary("Patch"); } public native static int patch(String oldApkPath, String newApkPath, String patchPath); }
2.在android studio中点击 Build -> Make Project,生成JniClient.java文件的class文件,class文件在app_path/build/intermediates/classes/debug目录下
3.cmd 切换到 <Project>\app\src\main的目录下
4.执行生成.h文件的命令
javah -d jni -classpath <SDK_android.jar>;..\..\build\intermediates\classes\debug com\xfappmarket\patch\JniClient
5.执行之后会在..\src\main目录下出现一个新目录jni,该目录下有com_xfappmarket_patch_JniClient.h文件
二.生成.c文件
1.新建com_xfappmarket_patch_JniClient.c文件 2.文件内容如下
#include "bspatch.h" #include "com_xfappmarket_patch_JniClient.h" #include <jni.h> #include <stdlib.h> #include <android/log.h> JNIEXPORT jint JNICALL Java_com_xfappmarket_patch_JniClient_patch(JNIEnv* env, jobject othis, jstring argv1, jstring argv2, jstring argv3) { char ** argv; int loopVar,result; argv = (char**) malloc(4 * sizeof(char*)); for (loopVar = 0; loopVar < 4; loopVar++) { argv[loopVar] = (char*) malloc(100 * sizeof(char)); } argv[0] = "bspatch"; argv[1] = (*env)->GetStringUTFChars(env, argv1, 0); argv[2] = (*env)->GetStringUTFChars(env, argv2, 0); argv[3] = (*env)->GetStringUTFChars(env, argv3, 0); result=bspatch(argv); (*env)->ReleaseStringUTFChars(env, argv1, argv[1]); (*env)->ReleaseStringUTFChars(env, argv2, argv[2]); (*env)->ReleaseStringUTFChars(env, argv3, argv[3]); return result; }三.导入文件
向src/main/jni文件夹下导入bzip2相关的文件和Android.mk文件,Android.mk文件内容如下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #bzlib模块 bzlib_files := \ blocksort.c \ huffman.c \ crctable.c \ randtable.c \ compress.c \ decompress.c \ bzlib.c LOCAL_MODULE := libbz LOCAL_SRC_FILES := $(bzlib_files) include $(BUILD_STATIC_LIBRARY) #bspath模块 include $(CLEAR_VARS) LOCAL_MODULE := bspatch LOCAL_SRC_FILES := bspatch.c LOCAL_C_INCLUDES := bspatch.h LOCAL_STATIC_LIBRARIES := libbz #引入libbz库 include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := Patch --------------------------》System.loadLibrary("Patch"); LOCAL_SRC_FILES := com_xfappmarket_patch_JniClient.c LOCAL_STATIC_LIBRARIES := bspatch LOCAL_LDLIBS := -llog#加入log include $(BUILD_SHARED_LIBRARY)四.生成.so文件
在src/main/jni文件夹下,使用命令行ndk-build,ndk会自动在src/main下生成libs和obj目录,需要用到的patch库文件就是 libs/armeabi/libPatch.so。(如果生成.so文件后运行时报错说找不到bspatch,则需要clean syc工程,然后可以正常使用)
参考:http://blog.youkuaiyun.com/duguang77/article/details/17676797