使用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
答
您可以通过三个步骤实现您的目标,每个步骤都需要一些编程。最重要的是,您的资产全部存在于APK文件中,您的应用可以找到并阅读APK文件,其格式为ZIP存档。
- 找到你的APK文件的名称。
- 打开此文件以作为zip存档文件阅读。
- 遍历
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库的一部分。
这不是重复的https://stackoverflow.com/questions/26101371/checking-if-directory-folder-exists-in-apk-via-native-code-only? –
@AlexCohn编号与该问题的主要区别在于,我事先不知道文件夹名称 - 我想在运行时发现它。 – vganin