通过文件系统访问Android NDK中的资源

3
我正在将一个相当庞大的C++游戏引擎从Windows/Mac移植到Android。有许多预先存在的代码可用于读取游戏资源。此外,还有相当多的代码进行文件系统调用(stat文件以确保它们存在,查找目录中的所有文件和目录等)。
现在,我只想尽快让某些东西运行起来,所以我不想重写太多内容。有什么好方法可以使我们的游戏资产进入设备并最小限度地更改现有的标准C++文件系统API使用?
我已经使用Asset Manager API实现了一些基本支持,但它不支持文件系统调用,并且我担心1 MB资产大小限制在某个时候会影响我。
我还看过OBB,但是创建OBB文件的工具似乎不是当前SDK/NDK的一部分。否则,那看起来会非常完美。
将所有文件打包并在首次运行应用程序时将其提取到SD卡上是否是一个可怕的想法?或者是否有更好的处理方法?
更新:我并不担心能够在广泛的设备上运行,我特别关注较新的平板电脑,可能是10.1英寸的三星Galaxy Tab。
2个回答

0

在开发我们的(数据文件重)应用程序时,我们遇到了类似的问题,最终决定保持 APK 微小,并在第一次运行时下载数据文件;无论如何都必须下载它们,但是较小的 APK 在内部存储空间不多的旧设备上效果更好。此外,如果用户的数据计划有限或手机上的互联网连接速度慢,您还可以潜在地设置一种方式让他们直接从计算机复制文件。

apps-for-android 中的“Downloader”示例应用程序(混淆在“Samples”下面)几乎是这个问题的完整解决方案 - 您几乎可以只插入数据文件的详细信息,然后让它完成其余工作。


谢谢回复!我目前不太关心支持旧手机(虽然知道将来需要考虑这个问题),因为我们只是想让这个程序在一种相当新的平板电脑上运行起来。此外,我真的很想找到一个解决方案,它不涉及任何 Java 代码,只用本地 activity 中实现的 C/C++。 - matt

0

我写了一个应用程序,依赖于将大量本地代码放入Android文件系统中。我通过将文件打包成APK作为“资源”来实现这一点。您可以将它们放入应用程序的私有命名空间(即/data/data/com.yourdomain.yourapp/nativeFolder),而不是将它们推送到SD卡。

有关如何完成此操作的详细信息,请参见this question中我的答案。

将它们打包到第一次运行时仅需解压缩即可,以后无需再担心。此外,由于它们在应用程序的命名空间下,如果/当有人决定删除您的应用程序,则应该将其删除。

编辑: 此方法可用于将任何内容放入应用程序的私有区域;/data/data/com.yourdomain.yourapp/

但是,据我所知,您的应用程序必须创建此区域中的所有文件夹和子文件夹。幸运的是,这很容易做到。例如,要让您的应用程序创建一个文件夹:

Process mkdir = Runtime.getRuntime().exec("mkdir " +localPath);

这在大多数Linux shell中都可以正常工作。我浏览了我打包到APK中的资产文件夹,创建了相应的目录,并将所有本地文件复制到这些目录中。

你可能更关心的是Android shell的限制。有许多你可能想要但不存在的命令。例如stat,因此如果您的本地代码无法进行系统调用,则所有这些可能都是无意义的。


我并不想提取本机代码,我已经成功编译和加载了它,但是我希望能够轻松访问游戏的资产(XML描述、艺术资产等)。是否有另一个更适合该类型数据的文件夹? - matt
看我的更新。你可以将它解压到应用程序文件夹中的任何位置,并使其可访问。但是,stat不是Android shell知道的命令。如果这只是一个概念验证型的一次性项目,你可能可以为Android编译它并将其放在system/bin中。 - sarwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接