`
hzy3774
  • 浏览: 992334 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Android 使用NDK (JNI)简单解压7z压缩文件

阅读更多

    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中输出。



 文件成功解压



 压缩文件中的路径和输出路径不能存在中文,不然文件输出不了。

 

  • 大小: 55.5 KB
  • 大小: 39.7 KB
  • 大小: 18.9 KB
分享到:
评论
6 楼 hzy3774 2014-09-01  
cx2003198 写道
hzy3774 写道
cx2003198 写道
hzy3774 写道
后缀没多大关系吧,只要压缩方式是lzma

恩,
我看你用的库是920版本之前的,版本选择上有什么特别的地方么?求传授经验

使用的是465版本,缺点是不支持压缩文件里存在中文路径和文件,920应该能避免编码问题,等我再研究一下


我试了下 920可以移植到android正常解压


github上换成920版了,可以解压中文的了
5 楼 cx2003198 2014-09-01  
hzy3774 写道
cx2003198 写道
hzy3774 写道
后缀没多大关系吧,只要压缩方式是lzma

恩,
我看你用的库是920版本之前的,版本选择上有什么特别的地方么?求传授经验

使用的是465版本,缺点是不支持压缩文件里存在中文路径和文件,920应该能避免编码问题,等我再研究一下


我试了下 920可以移植到android正常解压
4 楼 hzy3774 2014-08-29  
cx2003198 写道
hzy3774 写道
后缀没多大关系吧,只要压缩方式是lzma

恩,
我看你用的库是920版本之前的,版本选择上有什么特别的地方么?求传授经验

使用的是465版本,缺点是不支持压缩文件里存在中文路径和文件,920应该能避免编码问题,等我再研究一下
3 楼 cx2003198 2014-08-28  
hzy3774 写道
后缀没多大关系吧,只要压缩方式是lzma

恩,
我看你用的库是920版本之前的,版本选择上有什么特别的地方么?求传授经验
2 楼 hzy3774 2014-08-28  
后缀没多大关系吧,只要压缩方式是lzma
1 楼 cx2003198 2014-08-28  
下载参考一下~顺便问一下楼主能解压lzma后缀的文件么?

相关推荐

    android jni使用libzip读取压缩文件

    本示例着重讲解如何使用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 经典实例Android NDK JNI 经典实例

    Android Studio NDK JNI配置Demo代码 2016

    本Demo代码主要展示了如何在Android Studio中配置NDK和JNI,以便在Android应用中使用本地库。 首先,我们需要了解NDK的基本概念。NDK是一套工具集,允许开发者在Android应用中使用C和C++代码,这可以提高性能,尤其...

    android ndk jni so库生成

    本篇我们将深入探讨如何使用Android NDK和JNI来生成本地动态链接库(so库)。 首先,我们需要了解NDK的基本工作流程。当你在Java代码中声明一个本地方法(如`native void someNativeFunction();`),Android Studio会...

    Android-ndk-jni AES加解密 C++

    **在Android中使用NDK和JNI实现AES** 1. **创建JNI接口**:首先,你需要在Java层定义JNI接口,这些接口将被C++代码实现。例如: ```java static { System.loadLibrary("aes"); } public native byte[] ...

    Android平台jni下7zip解压压缩

    7zip提供了丰富的API接口,用于读取、解压和处理压缩文件。需要注意的是,由于7zip的API是C接口,所以在JNI层需要进行必要的类型转换和错误处理。 4. **创建JNI接口**:在Java层创建JNI接口,通过`native`关键字...

    android-ndk(android-ndk-r23b-windows.zip)

    2. **头文件和库**:NDK提供了Android系统的API头文件和必要的库文件,使得开发者可以访问Android系统服务,如硬件设备、多媒体、网络等。 3. **构建系统**:如Build.Gradle插件,使得在Android Studio中可以方便地...

    Android studio 下 NDK Jni 开发 简单例子

    在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者在Android应用中使用C/C++代码,从而提高性能、优化资源使用,并利用现有的C/C++库。本篇文章将深入...

    android-ndk(android-ndk-r25b-linux.zip)

    Linux用户需要解压“android-ndk-r25b-linux.zip”,将其添加到PATH环境变量中,以便在终端中直接使用ndk-build、ndk-gdb等命令。此外,Linux下的开发环境设置,如编译器配置、交叉编译等,也需要熟悉。 总结来说...

    Android ndk jni 史上最强NDK入门项目实战

    《Android NDK与JNI实战:史上最详尽的NDK入门指南》 在移动开发领域,Android NDK(Native Development Kit)和JNI(Java Native Interface)是开发者用来实现高性能计算、利用硬件加速或调用C/C++库的重要工具。...

    Eclipse Android NDK JNI 详细开发流程

    本文将详细介绍如何在Eclipse环境下配置和使用Android NDK与JNI进行原生开发的过程。 #### 二、准备工作 1. **Eclipse SDK 3.6.1**:包括必要的ADT(Android Development Tools)和CDT(C/C++ Development Tools)插件...

    NDK JNI的学习

    - 调试JNI代码通常使用GDB或者Android Studio集成的NDK调试工具,需要设置断点、查看内存状态和变量值。 - 使用`__android_log_print()`等日志打印函数辅助调试。 6. **注意事项** - ABI兼容性:不同的设备可能...

    android-ndk(android-ndk-r26b-windows.zip)

    使用“android-ndk-r26b-windows.zip”,开发者需要解压到指定目录,并将其添加到Android Studio的环境变量中,以便在构建过程中使用。同时,Android Studio提供了对NDK的集成支持,可以在IDE内进行NDK相关的开发和...

    Android NDK JNI 开发

    Android NDK JNI 开发是移动应用开发中的一个重要领域,它允许开发者使用C++和其他原生语言来编写部分Android应用程序,从而提升性能、利用硬件加速以及复用现有的C/C++库。JNI(Java Native Interface)是Java平台...

    android ndk jni demo source code

    Android NDK和JNI是Android应用开发中的重要组成部分,它们允许开发者使用C++或者其他原生代码来实现性能敏感或需要高效计算的部分。这个"android ndk jni demo source code"是针对这一主题的一个示例项目,它已经...

    Android Studio JNI/NDK 编程

    Android Studio JNI/NDK编程是Android应用开发中的一个重要领域,它允许开发者利用C/C++的高效性能来编写部分应用程序,特别是在处理图形计算、硬件加速、底层库集成等场景时非常有用。JNI(Java Native Interface)...

    Android Studio中使用NDK/JNI

    在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者在Android应用中使用C/C++代码。本文将深入探讨如何在Android Studio中利用NDK和JNI,以及它们的应用...

    android-ndk(android-ndk-r23b-linux.zip)

    这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提升性能或...

    android-ndk(android-ndk-r26b-darwin.zip)

    在macOS系统中,下载并解压"android-ndk-r26b-darwin.zip"后,通常会将NDK安装到指定目录,例如`~/Android/NDK`。然后,需要将其路径添加到环境变量中,以便于命令行工具的调用。 使用NDK开发时,可以采用Android ...

Global site tag (gtag.js) - Google Analytics