【发布时间】:2011-10-08 05:14:32
【问题描述】:
我想知道如何从本机代码(即 C++ 文件)直接访问图像、声音文件等资源。实际上,我正在寻找任何可以帮助我使用asset_manager_jni.h 方法的示例。
寻找建议。提前致谢。
问候,
阿图尔·普拉卡什·辛格
【问题讨论】:
标签: android java-native-interface android-ndk native android-assets
我想知道如何从本机代码(即 C++ 文件)直接访问图像、声音文件等资源。实际上,我正在寻找任何可以帮助我使用asset_manager_jni.h 方法的示例。
寻找建议。提前致谢。
问候,
阿图尔·普拉卡什·辛格
【问题讨论】:
标签: android java-native-interface android-ndk native android-assets
嗯,您可以访问 stdio.h。因此,如果它位于已知位置(例如在 SD 卡上),您可以将其用作路径。并且网上有很多关于热使用stdio(fopen、fclose等)的教程。
问题是您捆绑到 apk 本身的资源(在 res/raw 或资产中)在安装后仍留在 apk 中。更糟糕的是,默认情况下,它们将被压缩,这使得读取它不可行。这可以避免,最简单的方法是将资产重命名为具有 .mp3 扩展名(或有其他扩展名)。这样做的原因是因为默认情况下,.mp3 不被压缩,无论它是否实际上是一个 mp3 文件)。如果您不喜欢以 .mp3 结尾的所有资产命名,您还可以使用其他扩展,以及告诉工具不要压缩数据的方法。
所以,你有几个选择:
在第一次运行时从网上下载资源,将它们放在不显眼的地方(下载时最好从 sdk 中获取该路径),然后使用它。
将您的资源存储在 apk 中(记住 .mp3 扩展名,在 assets 文件夹中)。在您第一次运行时,将资产提取到您有权访问的文件夹中(并且不会惹恼用户),然后使用那里的资源。
(我所做的)将您的资源存储在 apk 中(再次为 .mp3),并使用 jni 直接从 apk 中读取。是的,jni 有点慢,但是无论如何您都不应该从文件系统中读取那么多内容,当然也不应该处于性能临界点。 Nvidia 有一些非常有用的代码可以使用,你可以找到它here,如果我记得,它在示例代码中。在 libs 文件夹中,您可以使用一些与 stdio 匹配的优秀通用库,但它也从 apk 本身读取。
希望对你有帮助。
【讨论】:
我确实使用过一次这个技巧:
mv $file lib/lib%${file}.so
【讨论】: