Как использовать Asset Manager API в NDK для чтения необработанных данных?
У меня есть шейдеры, хранящиеся в папке активов. имя шейдера (имя файла): путь "vertex.vs": assets/shaders/vertex.vs
Я хочу получить доступ к этому файлу из файла C++ из NDK без вызова Java или JNI, что бы это ни было. Из чтения различных ресурсов мне удалось понять, что я должен использовать заголовок
#include <android/asset_manager.h>
После этого я создаю указатели и открываю их.
const char* mPath = "shaders/vertex.vs";
AAssetManager* mAssetManager;
AAsset* mAsset;
mAsset = AAssetManager_open(mAssetManager, mPath,AASSET_MODE_UNKNOWN);
int foo = AAsset_getLength(mAsset);
LOGD( "This is a number: %d", foo );
AAsset_close(mAsset);
Но это ничего не делает. И что с этой функцией чтения.
AAsset_read(mAsset,pBuffer,bytesToRead);
Где данные прочитаны? Как определить pBuffer? Может кто-нибудь поделиться простым примером о том, как читать данные из необработанного файла и как получить к ним доступ (например, показывать их в logcat)?
1 ответ
Вы должны инициализировать mAssetManager для начала, мы обычно получаем его из Java с помощью вызова JNI, см., Например, этот ответ. Вы можете получить этот Java-объект в вашем C++-коде, как это, но для этого все еще нужен JNIEnv.
Если вы действительно хотите извлечь ресурс из вашего APK без взаимодействия с JNI, это не невозможно. Хитрость заключается в том, чтобы найти ваш APK-файл и поверить, что это скрытый ZIP-файл.
Может ли кто-нибудь поделиться простым примером того, как читать данные из необработанного файла и как получить к нему доступ (например, показать его в logcat)?
Вот пример проекта, который распаковывает файл ресурсов из res / raw и помещает его в папку FilesDir (например, /data/user/0/com.example.myapp/files), доступную из собственного кода.
Также есть диаграмма деятельности, описывающая алгоритм этого подхода.