如何使用Android-NDK直接从本机代码访问资源(如声音,图像等)?

时间:2011-07-19 04:55:38

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

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

寻找建议。提前谢谢。

关心,

Atul Prakash Singh

2 个答案:

答案 0 :(得分:7)

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

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

所以,你有几个选择:

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

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

  3. (我的所作所为)将您的资源存储在apk(.mp3再次)中,并使用jni直接从apk中读取。是的,jni有点慢,但你不应该从文件系统读取这么多,当然也不是在性能关键点。 Nvidia有一些你可以使用的非常有用的代码,你可以找到它here,如果我记得那就在示例代码中。在libs文件夹中有一些很好的通用库,你可以使用它们匹配stdio,除了它还可以从apk本身读取。

  4. 希望它有所帮助。

答案 1 :(得分:1)

我曾经使用过这个技巧:

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