通过 ndk 使用 Android 中的资源 – C++有几种选择:
- 使用 AssetManager 访问 apk 文件中的资源
- 从互联网下载资源并将其解压到应用程序目录中,使用标准 C++ 方法使用它们
- 组合方法–通过AssetManager访问apk中资源的存档,将它们解压到应用程序目录中,然后使用标准C++方法使用它们
接下来我将描述Flame Steel Engine游戏引擎中使用的组合访问方法。
使用 SDL 时,您可以简化对 apk 资源的访问;该库包装了对 AssetManager 的调用,提供类似于 stdio 的接口(fopen、fread、fclose 等)
SDL_RWops *io = SDL_RWFromFile("files.fschest", "r");
将apk文件下载到缓冲区后,需要将当前工作目录更改为应用程序目录,应用程序可以使用该目录,而无需获得额外的权限。为此,我们将使用 SDL 包装器:
chdir(SDL_AndroidGetInternalStoragePath());
接下来,使用 fopen、fwrite、fclose 将存档从缓冲区写入当前工作目录。一旦存档位于 C++ 可以访问的目录中,就将其解压。可以使用两个库的组合来解压 Zip 档案: minizip 和 zlib,第一个可以处理档案的结构,而第二个可以解压数据。
为了获得更多控制和易于移植,我实现了自己的零压缩存档格式,称为 FChest(Flame Steel Chest)。该格式支持将目录与文件一起归档并解压;不支持文件夹层次结构;您只能使用文件。
我们连接 FSCest 库的标头,解压存档:
#include "fschest.h"
FSCHEST_extractChestToDirectory(archivePath, SDL_AndroidGetInternalStoragePath());
解压后,C/C++ 接口将可以访问存档中的文件。因此,我不必重写引擎中文件的所有工作,而只需在启动阶段添加文件解包。
来源
https://developer.android.com/ndk/参考/组/资产
源代码
https://gitlab.com/demensdeum/space-捷豹动作角色扮演游戏
https://gitlab.com/demensdeum/fschest