使用Android本机AAssetManager的文件层次结构

问题描述:

问题

我想知道如何从本机代码制作Android资产文件夹的文件层次结构。我正在使用AAssetManager_openDir,但AAssetDir_getNextFileName不会返回任何目录名称,所以基本上我无法深入到层次结构中,因为我无法获取子文件夹的名称。有什么办法可以用AAssetManager来解决这个问题,还是我应该在Java中实现这个?使用Android本机AAssetManager的文件层次结构

资产看起来像

a/ 
    file1 
    file2 
b/ 
    file3 
    c/ 
    file4 

C++代码

AAssetDir* assetDir = AAssetManager_openDir(env, ""); 
// filename is NULL since there is only folders at the root folder 
const char* filename = AAssetDir_getNextFileName(assetDir); 
AAssetDir_close(assetDir); 
AAssetDir* assetDir = AAssetManager_openDir(env, "a"); 
// filename is "file1" 
const char* filename = AAssetDir_getNextFileName(assetDir); 
// filename is "file2" 
filename = AAssetDir_getNextFileName(assetDir); 
AAssetDir_close(assetDir); 

编辑:

我发现AAssetDir_getNextFileName实现字面上从输出过滤目录。 Link to source code

+0

这不是重复的https://*.com/questions/26101371/checking-if-directory-folder-exists-in-apk-via-native-code-only? –

+0

@AlexCohn编号与该问题的主要区别在于,我事先不知道文件夹名称 - 我想在运行时发现它。 – vganin

您可以通过三个步骤实现您的目标,每个步骤都需要一些编程。最重要的是,您的资产全部存在于APK文件中,您的应用可以找到并阅读APK文件,其格式为ZIP存档。

  1. 找到你的APK文件的名称。
  2. 打开此文件以作为zip存档文件阅读。
  3. 遍历assets/<whatever>的zip内容。

对于1),您可以use Java或者如果您必须留在C++中,请过滤/proc/<pid>/fd。你可能会发现一些系统APK文件(框架),但你的APK将是唯一不是系统的。

2),见use zlib to list directory structure of apk file in android。请注意,zlib是公共NDK库的一部分。