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中输出。
文件成功解压
压缩文件中的路径和输出路径不能存在中文,不然文件输出不了。
相关推荐
本示例着重讲解如何使用JNI结合libzip库来读取压缩文件,同时对比了通过NDK自带的API接口读取assets资源文件的方法。 libzip是一个开源的C库,用于处理ZIP档案,包括读取、创建、更新和提取文件。在Android环境中,...
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
本Demo代码主要展示了如何在Android Studio中配置NDK和JNI,以便在Android应用中使用本地库。 首先,我们需要了解NDK的基本概念。NDK是一套工具集,允许开发者在Android应用中使用C和C++代码,这可以提高性能,尤其...
本篇我们将深入探讨如何使用Android NDK和JNI来生成本地动态链接库(so库)。 首先,我们需要了解NDK的基本工作流程。当你在Java代码中声明一个本地方法(如`native void someNativeFunction();`),Android Studio会...
**在Android中使用NDK和JNI实现AES** 1. **创建JNI接口**:首先,你需要在Java层定义JNI接口,这些接口将被C++代码实现。例如: ```java static { System.loadLibrary("aes"); } public native byte[] ...
7zip提供了丰富的API接口,用于读取、解压和处理压缩文件。需要注意的是,由于7zip的API是C接口,所以在JNI层需要进行必要的类型转换和错误处理。 4. **创建JNI接口**:在Java层创建JNI接口,通过`native`关键字...
2. **头文件和库**:NDK提供了Android系统的API头文件和必要的库文件,使得开发者可以访问Android系统服务,如硬件设备、多媒体、网络等。 3. **构建系统**:如Build.Gradle插件,使得在Android Studio中可以方便地...
在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者在Android应用中使用C/C++代码,从而提高性能、优化资源使用,并利用现有的C/C++库。本篇文章将深入...
Linux用户需要解压“android-ndk-r25b-linux.zip”,将其添加到PATH环境变量中,以便在终端中直接使用ndk-build、ndk-gdb等命令。此外,Linux下的开发环境设置,如编译器配置、交叉编译等,也需要熟悉。 总结来说...
《Android NDK与JNI实战:史上最详尽的NDK入门指南》 在移动开发领域,Android NDK(Native Development Kit)和JNI(Java Native Interface)是开发者用来实现高性能计算、利用硬件加速或调用C/C++库的重要工具。...
本文将详细介绍如何在Eclipse环境下配置和使用Android NDK与JNI进行原生开发的过程。 #### 二、准备工作 1. **Eclipse SDK 3.6.1**:包括必要的ADT(Android Development Tools)和CDT(C/C++ Development Tools)插件...
使用“android-ndk-r26b-windows.zip”,开发者需要解压到指定目录,并将其添加到Android Studio的环境变量中,以便在构建过程中使用。同时,Android Studio提供了对NDK的集成支持,可以在IDE内进行NDK相关的开发和...
- 调试JNI代码通常使用GDB或者Android Studio集成的NDK调试工具,需要设置断点、查看内存状态和变量值。 - 使用`__android_log_print()`等日志打印函数辅助调试。 6. **注意事项** - ABI兼容性:不同的设备可能...
Android NDK JNI 开发是移动应用开发中的一个重要领域,它允许开发者使用C++和其他原生语言来编写部分Android应用程序,从而提升性能、利用硬件加速以及复用现有的C/C++库。JNI(Java Native Interface)是Java平台...
Android NDK和JNI是Android应用开发中的重要组成部分,它们允许开发者使用C++或者其他原生代码来实现性能敏感或需要高效计算的部分。这个"android ndk jni demo source code"是针对这一主题的一个示例项目,它已经...
Android Studio JNI/NDK编程是Android应用开发中的一个重要领域,它允许开发者利用C/C++的高效性能来编写部分应用程序,特别是在处理图形计算、硬件加速、底层库集成等场景时非常有用。JNI(Java Native Interface)...
这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提升性能或...
在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者在Android应用中使用C/C++代码。本文将深入探讨如何在Android Studio中利用NDK和JNI,以及它们的应用...
NDK的主要功能是让开发者能够在Android应用中使用原生代码,例如C、C++,以实现高性能计算或利用硬件加速等功能。 **JNI(Java Native Interface)**是Android NDK的核心组成部分,它提供了Java和本地代码之间的...