【问题标题】:File hierarchy with Android native AAssetManager使用 Android 原生 AAssetManager 的文件层次结构
【发布时间】:2018-02-23 19:13:08
【问题描述】:

问题

我想知道如何从原生代码制作 Android 中资产文件夹的文件层次结构。我正在使用AAssetManager_openDirAAssetDir_getNextFileName 不返回任何目录名称,所以基本上我无法深入了解层次结构,因为我无法获取子文件夹的名称。有没有办法用AAssetManager 解决这个问题,或者我应该用Java 实现这个?

示例

资产看起来像

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

【问题讨论】:

标签: android c++ android-ndk android-assets


【解决方案1】:

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

  1. 找到您的 APK 文件名。
  2. 打开此文件以作为 zip 存档读取。
  3. 迭代 assets/<whatever> 的 zip 内容。

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

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

【讨论】:

  • 更新: 一些框架,例如Experitest,可能会在您的进程中注入额外的 APK。
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多