4

私の前の質問は建設的ではないとして閉じられました。そこで編集しましたが、閉じられていることがわかりませんでした):

私は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): -------------- ----- ------------ ------------  ------------

ただし、(7z.exeを使用して)Windowsにコンテンツを一覧表示すると、次のようになります。

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

抽出に失敗します。少し長いので、ここにそのログキャットがあります。

ここにioの問題があるようですが、このアーカイブを一覧表示してもファイルが返されないため、別の問題が発生している可能性があります。

J7zipを使用してアーカイブコンテンツを抽出および一覧表示した経験のある人はいますか?

4

1 に答える 1

2

ここにいくつかの可能な解決策があります。

私は最初、7zipjbindingプロジェクトをクロスコンパイルすることから始めました。armeabicおよびc++コンパイラをマシンにインストールし、プロジェクトをビルドしようとしました。残念ながら、Androidプロジェクトで使用できるバイナリをビルドできませんでした。コンパイルされたjbindingバイナリをロードしようとして問題が発生したライブラリについては、フォーラムの投稿で説明しました。

私の次のリードは、p7zのJavaポートであるJ7zip(http://sourceforge.net/projects/p7zip/files/J7Zip/)を実装することでした。これを実装することはそれほど悪くはありませんでしたが、j7zライブラリがSDカードのルートに書き込もうとするコードを変更する必要がありました(ルートアクセスなし)。このポートはほとんどの部分でうまく機能しましたが、より大きなアーカイブ、または多くの同様のファイルを含むアーカイブを抽出するときにメモリ不足エラーが発生します。問題は、ライブラリが辞書に割り当てようとしているメモリが多すぎることでした(1つのファイルだけを抽出したい場合でも、抽出されたすべてのコンテンツのサイズが割り当てられます)。したがって、このライブラリは私の場合は機能せず、使用している圧縮をサポートするとは思いません。

そして最後に、私はandro7z( http://code.google.com/p/andro7z/ )と呼ばれるこの一見死んでいるように見えるGoogleCodeプロジェクトにたどり着きました。このコードには、7zipのバージョンと非常に基本的なJNI実装が含まれています。最初にソースを取得するとき、それができるのは印刷の使用法だけですが、それはあなたに良い出発点を与えます。アーカイブに含まれているファイルの名前を含む文字列の配列を返したり、アーカイブから特定のファイルまたはすべてのファイルを抽出したりできるように、調査して変更することになりました。私は7zファイルしか扱っていなかったので、あまり洗練された実装にはしませんでしたが、機能します。実際の7zipc/ cppソースを使用することは、アウトストリームが適切に処理され、法外な辞書サイズを割り当てようとしないことを意味します。

andro7zをコンパイルするには、Android NDKをまだ持っていない場合は、それを入手する必要があります。そこから、Javaを使用してネイティブバイナリと対話できるように、独自のJNIメソッドを作成する必要があります。7za.cppの上部にいくつかのテスト引数が表示され、それらのコメントを解除して、ハードコードされた抽出をテストできます。

于 2013-02-03T20:10:33.043 に答える