Как получить доступ к ресурсам (таким как звук, изображения и т. Д.) Напрямую из нативного кода с помощью Android-NDK? - PullRequest
4 голосов
/ 19 июля 2011

Я хочу знать, что как я могу напрямую получить доступ к ресурсам, таким как изображения, звуковые файлы и т. Д. Из собственного кода, то есть файлов C ++. На самом деле я ищу любой пример, который мог бы помочь мне использовать методы asset_manager_jni.h.

Ищу предложения. Заранее спасибо.

С уважением,

Атул Пракаш Сингх

Ответы [ 2 ]

7 голосов
/ 19 июля 2011

Ну, у вас есть доступ к stdio.h.Так что, если он находится в известном месте (скажем, на SD-карте), вы можете просто использовать его как путь.И в сети есть много уроков о том, как использовать stdio (fopen, fclose и т. Д.).

Проблема в том, что ресурсы, которые вы объединяете в самом apk (либо в res / raw, либо в assets), остаютсявнутри apk после установки.Хуже всего то, что по умолчанию они будут сжаты, что делает чтение неосуществимым.Этого можно избежать, и самый простой способ - переименовать актив, чтобы иметь расширение .mp3 (или есть другие).Причина этого заключается в том, что по умолчанию .mp3 не сжимается, независимо от того, является ли он mp3-файлом.Есть другие расширения, которые вы можете использовать, и способы сказать инструментам не сжимать ваши данные, если вам не нравится именовать все ваши активы с помощью .mp3 в конце.

Итак, у вас есть несколько вариантовздесь:

  1. Загрузите свои ресурсы из сети при первом запуске, поместите их в ненавязчивое место (вероятно, лучше всего получить этот путь из sdk, когда вы выполняете загрузку), ииспользуйте это.

  2. Сохраните ваши ресурсы в apk (помните расширение .mp3, в папке assets).При первом запуске извлеките ресурсы в папку, к которой у вас есть доступ (и не раздражает пользователя), и используйте ресурсы оттуда.

  3. (что я делаю) Сохранитьваши ресурсы в apk (снова .mp3) и используйте jni для чтения непосредственно из apk.Да, JNI немного медленный, но вы все равно не должны слишком много читать из файловой системы, и уж точно не в критической точке производительности.У Nvidia есть очень полезный код, который вы можете использовать, вы можете найти его здесь , он есть в примере кода, если я помнюВнутри папки libs есть несколько хороших библиотек общего назначения, которые вы можете использовать, которые соответствуют stdio, за исключением того, что он также читает из самого apk.

Надеюсь, это поможет.

1 голос
/ 20 июля 2011

Я использовал этот трюк один раз:

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