-->

J7zip在Android上 - 提取存档和清单内容(J7zip on Android - Extr

2019-08-04 15:48发布

我刚才的问题得到了封闭,没有建设性。 我编辑它在那里,但没有看到它被关闭):

我正在写涉及提取7z格式的应用程序。 似乎没有要任何原生支持,所以我一直在寻找第三方库或源代码,我可以融入我的项目的冒险了。

我一直在努力实现J7zip ,但都没有成功。

清单存档的内容没有返回文件:

12-24 13:36:44.216: I/System.out(18473): J7zip 4.43 ALPHA 2 (2 CPUs)
12-24 13:36:44.232: I/System.out(18473):   Date   Time   Attr         Size   Compressed  Name
12-24 13:36:44.232: I/System.out(18473): -------------- ----- ------------ ------------  ------------
12-24 13:36:44.240: I/System.out(18473): -------------- ----- ------------ ------------  ------------

但是,在Windows(使用7z.exe)列出的内容返回以下

7-Zip 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: archive.7z

--
Path = archive.7z
Type = 7z
Method = LZMA
Solid = -
Blocks = 1
Physical Size = 183119
Headers Size = 122

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
                    .....       524288       182997  contents.txt
------------------- ----- ------------ ------------  ------------------------
                                524288       182997  1 files, 0 folders

提取失败,我的是,logcat的这里 ,因为这是一个有点长。

似乎这里是一个IO的问题,但我怀疑的东西,因为这个上市回报存档文件没有别的。

没有人有经验的提取和使用J7zip上市存档内容?

Answer 1:

这里有几个可能的解决方案。

我第一次试图通过启动交叉编译7zip的jbinding项目。 我安装了armeabi C和C ++编译器在我的机器,并试图构建项目。 不幸的是,我无法建立,可以在Android项目中使用二进制。 我提到了用试图加载编译后的二进制文件jbinding早在论坛的帖子引起麻烦的库。

我的下引线,实现p7z,J7zip(在Java端口http://sourceforge.net/projects/p7zip/files/J7Zip/ )。 实现这个是不是太糟糕,但我不得不修改代码,其中j7z库将尝试写入SD卡(无根访问权限)的根。 此端口行之有效的大部分,但提取较大的档案,或包含许多类似的文件归档时会导致内存不足的错误。 问题是该库试图分配太多内存的字典(这将分配的全部提取的内容大小,即使你只是想提取一个文件)。 因此,该库将不会在我的情况下工作,我不认为它会支持你正在使用的压缩。

最后,我来到被称为andro7z这个看似死谷歌代码项目( http://code.google.com/p/andro7z/ )。 该代码包含一个版本7zip的和一个非常,非常基本的JNI实现。 当你第一次抢源,所有可以做的是打印的使用,但它给你一个很好的起点。 我结束了学习,并修改它,所以我可以从档案中返回一个包含包含在存档文件的名称的字符串数组,以及提取特定的或所有文件。 因为我只用7z压缩文件时,我没有做它一个很优雅的实现,但它的作品。 使用实际7zip的C / CPP来源意味着,在流处理得当,不会尝试分配离谱字典大小。

要编译andro7z你需要抓住的Android NDK,如果你不已经拥有了它。 从那里,你将不得不编写自己的JNI方法,这样你就可以使用Java本机二进制文件交互。 你会看到一些测试参数在7za.cpp的顶部,您就可以取消注释那些和测试硬编码的提取。



文章来源: J7zip on Android - Extracting From an Archive and Listing Contents