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

时间:2011-12-06 22:37:32

标签: android android-ndk

我正在将一个用C ++编写的相当大的游戏引擎从Windows / Mac移植到Android。有很多预先存在的代码可以读取游戏资产。此外,还有相当多的代码在进行文件系统调用(对文件进行统计以确保它们存在,查找目录中的所有文件和目录等)。

现在,我正专注于尽快开始运行,所以我不想重写很多这样的东西。将我们的游戏资产放到设备上并通过对现有标准C ++文件系统API使用的最小改动来访问它们的好方法是什么?

我已经使用Asset Manager API实现了一些基本支持,但是它不支持文件系统调用,我担心1 MB资产大小限制会在某些时候咬我。 / p>

我也看过OBB,但是用于创建OBB文件的工具看起来不像是当前SDK / NDK的一部分。否则,看起来它会很完美。

在第一次运行应用程序时,打包所有文件并将其提取到SD卡上是一个可怕的想法吗?或者有更好的方法来解决这个问题吗?

更新:我也不太关心能够在各种各样的设备上运行,我特别关注新的平板电脑,可能是10.1“三星Galaxy标签。

2 个答案:

答案 0 :(得分:0)

我们在开发我们的(数据文件重)应用程序时遇到了类似的问题,我们最终决定保持APK微小,并在第一次运行时简单地下载我们的数据文件;他们将不得不以任何方式下载,但是一个小的APK在没有大量内部存储的旧设备上运行得更好。此外,如果他们的手机上的数据计划有限或互联网连接速度较慢,您可能会直接从他们的计算机上直接复制文件。

apps-for-android中的“Downloader”示例应用程序(令人困惑地隐藏在“示例”下)几乎是一个完全实现的解决方案 - 你几乎可以插入数据文件的细节并让它做其余的。

答案 1 :(得分:0)

我编写了一个依赖于将大量本机代码放入Android文件系统的应用程序。我通过将文件打包为APK作为“资源”来完成此操作。您可以将其放入应用程序的私有名称空间I.E.而不是将它们推送到SD卡。 /data/data/com.yourdomain.yourapp/nativeFolder。

有关如何完成此操作的详细信息,您可以看到我对this question的回答。

打包只是在第一次运行时解压缩它们并且再也不用担心它们。此外,由于它们位于应用程序的命名空间下,因此当有人决定删除您的应用时,应删除它们。

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

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

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

就像在大多数linux shell中一样。我浏览了打包到我的APK中的assets文件夹,制作了相应的目录并将所有本机文件复制到这些目录中。

你可能更关心的是有限的Android外壳。您可能需要的许多命令不存在。 stat for example isn't available,如果您的本机代码无法进行系统调用,那么所有这些都可能没有实际意义。