【问题标题】:How to access resources (like sound, images etc) directly from native code using Android-NDK?如何使用 Android-NDK 直接从本机代码访问资源(如声音、图像等)?
【发布时间】:2011-10-08 05:14:32
【问题描述】:

我想知道如何从本机代码(即 C++ 文件)直接访问图像、声音文件等资源。实际上,我正在寻找任何可以帮助我使用asset_manager_jni.h 方法的示例。

寻找建议。提前致谢。

问候,

阿图尔·普拉卡什·辛格

【问题讨论】:

标签: android java-native-interface android-ndk native android-assets


【解决方案1】:

嗯,您可以访问 stdio.h。因此,如果它位于已知位置(例如在 SD 卡上),您可以将其用作路径。并且网上有很多关于热使用stdio(fopen、fclose等)的教程。

问题是您捆绑到 apk 本身的资源(在 res/raw 或资产中)在安装后仍留在 apk 中。更糟糕的是,默认情况下,它们将被压缩,这使得读取它不可行。这可以避免,最简单的方法是将资产重命名为具有 .mp3 扩展名(或有其他扩展名)。这样做的原因是因为默认情况下,.mp3 不被压缩,无论它是否实际上是一个 mp3 文件)。如果您不喜欢以 .mp3 结尾的所有资产命名,您还可以使用其他扩展,以及告诉工具不要压缩数据的方法。

所以,你有几个选择:

  1. 在第一次运行时从网上下载资源,将它们放在不显眼的地方(下载时最好从 sdk 中获取该路径),然后使用它。

  2. 将您的资源存储在 apk 中(记住 .mp3 扩展名,在 assets 文件夹中)。在您第一次运行时,将资产提取到您有权访问的文件夹中(并且不会惹恼用户),然后使用那里的资源。

  3. (我所做的)将您的资源存储在 apk 中(再次为 .mp3),并使用 jni 直接从 apk 中读取。是的,jni 有点慢,但是无论如何您都不应该从文件系统中读取那么多内容,当然也不应该处于性能临界点。 Nvidia 有一些非常有用的代码可以使用,你可以找到它here,如果我记得,它在示例代码中。在 libs 文件夹中,您可以使用一些与 stdio 匹配的优秀通用库,但它也从 apk 本身读取。

希望对你有帮助。

【讨论】:

  • 听起来不错。我现在只需要一个目录结构,我通常可以在其中找到图片、视频、音乐等。我的意思是,当你用手机拍照时,它通常会转到哪个文件夹?
【解决方案2】:

我确实使用过一次这个技巧:

mv $file lib/lib%${file}.so

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多