VisualStudio 2017 Android NDK access AssetManager [дубликат]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

4
задан Pavel S. 29 April 2014 в 19:45
поделиться

2 ответа

Ваши активы упакованы в ваш apk, поэтому вы не можете ссылаться на них напрямую во время выполнения, как в приведенном вами образце кода. У вас есть 2 варианта:

  • Обработать активы как входной поток, используя

Context.getAssets().open('cacert.cert')

  • Копировать из вашего ресурса в локальный файл в файле dir, а затем ссылайтесь на имя файла скопированного файла.
1
ответ дан user868459 20 August 2018 в 13:02
поделиться
  • 1
    Первый вариант не будет работать для меня сейчас. Что касается второго - в какое место я должен поместить этот файл, чтобы я мог получить к нему доступ из .so lib? – Pavel S. 29 April 2014 в 20:01
  • 2
    Любое фактическое расположение файловой системы - внутреннее хранилище, внешнее и т. Д. - очевидно, со всеми обычными компромиссами. Я считаю, что есть также способы доступа к активу из собственного кода, но это не просто «файл». – Chris Stratton 29 April 2014 в 20:08
  • 3
    Так что я должен использовать абсолютный путь? Спасибо, ребята, я попробую. – Pavel S. 29 April 2014 в 20:15
  • 4
    Неясно, что вы имеете в виду. Если вы имеете в виду копию, которую вы создаете в качестве фактического файла, то да, вам нужно либо передать собственный код пути, который он может использовать, либо файловый дескриптор. Если вы имеете в виду сам актив, у него нет пути, потому что он не является файлом (хотя по-прежнему можно получить доступ специальными средствами). – Chris Stratton 29 April 2014 в 20:40
  • 5
    Да, я имею в виду копирование файла, спасибо. – Pavel S. 29 April 2014 в 22:03

Вы можете просто использовать класс AAssetManager в C ++.

В основном вам нужно:

  • Во время инициализации библиотеки вы получите указатель на: AAssetManager* assetManager
  • Используйте его для чтения вашего файла:
    // Open your file
    AAsset* file = AAssetManager_open(assetManager, filePath, AASSET_MODE_BUFFER);
    // Get the file length
    size_t fileLength = AAsset_getLength(file);
    
    // Allocate memory to read your file
    char* fileContent = new char[fileLength+1];
    
    // Read your file
    AAsset_read(file, fileContent, fileLength);
    // For safety you can add a 0 terminating character at the end of your file ...
    fileContent[fileLength] = '\0';
    
    // Do whatever you want with the content of the file
    
    // Free the memoery you allocated earlier
    delete [] fileContent;
    

Вы можете найти официальную документацию официального ndk здесь .

Изменить: Чтобы получить объект AAssetManager:

  • В своей основной деятельности основной функцией является приложение paramater android_app *, вам просто нужно его получить здесь: app-> activity-> assetManager
  • Если у вас есть активность Java, вам необходимо отправить через JNI экземпляр объекта Java AssetManager, а затем использовать функцию AAssetManager_fromJava ()
12
ответ дан Sistr 20 August 2018 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: