我之前的问题因为没有建设性而被关闭了。我在那里编辑过,但没看到它已经关闭了):
我正在编写一个涉及提取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
提取失败,我有here的logcat,因为它有点长。
这里似乎有一个io问题,但我怀疑其他东西,因为列出此档案不会返回任何文件。
有没有人有使用J7zip提取和列出存档内容的经验?
答案 0 :(得分:2)
这里有一些可能的解决方案。
我首先尝试交叉编译7zip jbinding项目。我将armeabi c和c ++编译器安装到我的机器上并尝试构建项目。不幸的是,我无法构建可以在Android项目中使用的二进制文件。我提到了试图在论坛帖子中加载已编译的jbinding二进制文件时遇到问题的库。
我的下一个领导是实现p7z的Java端口,J7zip(http://sourceforge.net/projects/p7zip/files/J7Zip/)。实现这个并不算太糟糕,除了我必须修改j7z库试图写入SD卡根目录的代码(没有root访问权限)。此端口在大多数情况下运行良好,但在提取较大的存档或包含许多类似文件的存档时会导致内存不足错误。问题是库试图为字典分配太多内存(它会分配所有提取内容的大小,即使你只想提取一个文件)。所以这个库在我的情况下不起作用,我认为它不会支持你正在使用的压缩。
最后,我到达了这个看似已死的Google Code项目,名为andro7z(http://code.google.com/p/andro7z/)。此代码包含7zip版本和非常非常基本的JNI实现。当您第一次获取源代码时,它所能做的只是打印使用,但它为您提供了一个很好的起点。我最终学习并修改它,因此我可以返回包含存档中包含的文件名称的字符串数组,以及从存档中提取特定或所有文件。由于我只使用7z文件,我没有使它成为一个非常优雅的实现,但它的工作原理。使用实际的7zip c / cpp源意味着可以正确处理输出流,并且不会尝试分配令人发指的字典大小。
要编译andro7z,如果你还没有它,你需要获取android NDK。从那里开始,您将不得不编写自己的JNI方法,以便可以使用Java与本机二进制文件进行交互。您将在7za.cpp的顶部看到一些测试参数,您将能够取消注释并测试硬编码提取。