C语言使用LZMA SDK解压非加密7z文件介绍:http://hzy3774.iteye.com/blog/2104510
github项目地址:https://github.com/hzy3774/AndroidUn7zip
把前文中相应源文件和头文件复制到jni目录下:
写java接口源文件:
package com.hu.andun7z; import java.io.File; public class AndUn7z { public static boolean extract7z(String filePath, String outPath) { File outDir = new File(outPath); if(!outDir.exists() || !outDir.isDirectory()) { outDir.mkdirs(); } return (AndUn7z.un7zip(filePath, outPath) == 1); } //JNI interface private static native int un7zip(String filePath, String outPath); static { System.loadLibrary("un7z"); } }
在项目中只要调用extract7z(String filePath, String outPath)就可以实现解压了
javah -jni 生成对应的c++接口文件,填充函数:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_hu_andun7z_AndUn7z */ #ifndef _Included_com_hu_andun7z_AndUn7z #define _Included_com_hu_andun7z_AndUn7z #ifdef __cplusplus extern "C" { #endif #include "JniWrapper.h" /* * Class: com_hu_andun7z_AndUn7z * Method: un7zip * Signature: (Ljava/lang/String;Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_com_hu_andun7z_AndUn7z_un7zip (JNIEnv *env, jclass thiz, jstring filePath, jstring outPath) { const char* cfilePath = (const char*)env->GetStringUTFChars(filePath, NULL); const char* coutPath = (const char*)env->GetStringUTFChars(outPath, NULL); LOGD("start extract filePath[%s], outPath[%s]", cfilePath, coutPath); jint ret = extract7z(cfilePath, coutPath); LOGD("end extract"); env->ReleaseStringUTFChars(filePath, cfilePath); env->ReleaseStringUTFChars(outPath, coutPath); return ret; } #ifdef __cplusplus } #endif #endif
写NDK相关的头文件JniWrapper.h
/* * JniWrapper.h * * Created on: 2014-8-12 * Author: HZY */ #ifndef JNIWRAPPER_H_ #define JNIWRAPPER_H_ #include <jni.h> #include <android/log.h> #include "src/Types.h" #define LOG_TAG "jniLog" #undef LOG #ifdef DEBUG #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) #else #define LOGD(...) do{}while(0) #endif #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__) int extract7z(const char* srcFile, const char* dstPath); #endif /* JNIWRAPPER_H_ */
接口最终调用上文中介绍的函数:int MY_CDECL extract7z(const char* srcFile, const char* dstPath);
打印的输出改到Logcat中输出。
文件成功解压
压缩文件中的路径和输出路径不能存在中文,不然文件输出不了。
相关推荐
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
Android NDK 开发时需要的 常用的JNI API
例子通过jni调用libzip库读取压缩文件,和通过ndk自带api接口读取assets资源文件,附测试工程。
Android studio 下 NDK Jni 开发 简单demo 谢谢
ndk demo开发过程在http://blog.csdn.net/gzjck/article/details/51724970
Android-ndk-jni AES加解密 压缩文件里面有 aes加解密 .c .h 文件 还用使用方法
ndk jni的学习
原文链接 http://blog.csdn.net/u012840567/article/details/53283274
android ndk举例 jni
android解压库支持解压rar,解压速度快,支持NDK,源码编译 High compression ratio in 7z format with LZMA and LZMA2 compression Supported formats: Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM...
AndroidStudio环境下的jni调用(NDK),这个教程可以让完全不会AndroidStudio的人学会jni调用。完全步骤话,非常简单。
Android Studio JNI/NDK 编程; 具体见博客: http://blog.csdn.net/q610098308/article/details/51313341
这是Android NDK开发标准的JNI和Android.mk编写模版,里面的一些东西可能涉及我的项目,但不影响观看
Android Studio中使用NDK/JNI 的相关代码http://blog.csdn.net/jfzl123/article/details/53436600
android-ndk(android-ndk-r26b-windows.zip)适用于Windows系统
Android-NDK-MD5-安卓jni 进行md5加密; Android-NDK-MD5-安卓jni 进行md5加密
一个简单的OpenGL ES 3.0 示例 (Android NDK jni)
附件是Android下检测ndk和jni内存泄漏的demo,可以用于native中malloc和free的检测。使用方法(参见博客):https://blog.csdn.net/zhuyong006/article/details/88537499
Android的NDK与JNI雕龙小技.pdf
android-ndk(android-ndk-r25b-windows.zip)适用于Windows系统