2016-10-10 4 views
0

Мы используем Android NDK для написания библиотеки C++ на андроиде, и библиотеке необходимо использовать JavaVM и AAssetManager. Проблема в том, что мы не находим доступа к JavaVM и AAssetManager внутри нашей библиотеки.Получите JavaVM и AAssetManager в собственной библиотеке Android C++

То, что я знаю:

  1. В родном хост-приложения, мы можем получить их от ANativeActivity
  2. AAssetManager_fromJava если ява
  3. jint JNI_OnLoad(JavaVM* vm, void* reserved) Кажется, она не может работать, если хост-приложение также родной C++

Библиотека будет доставляться нашим пользователям. Не будет изящно заставить наших пользователей устанавливать JavaVM и AAssetManager. Есть ли у вас какие-либо идеи? благодаря

ответ

0

Если вы хотите, чтобы покрыть оба случая таким же образом («типичный» и «родной» приложение) - единственный путь следующий:

  • Добавить MyLibrary.java в библиотеку. Этот файл должен объявить собственный метод MyLibrary.init(AssetManager am);. Реализация этого метода должна быть помещена в коде C++, где вы получите ссылку на Java к управлению активами и затем может получить AAssetManager *
  • Добавить JNI_OnLoad() в библиотеку, чтобы получить JavaVM*
  • Создайте свою библиотеку как отдельный .so, чтобы система чтобы вызвать ваше JNI_OnLoad()

Использование выглядит следующая:

  • Клиент приложение объявляет пользовательские Application класса в своем манифесте
  • Внедрение этого настраиваемого класса переопределяет метод onAttachBaseContext(), реализация которого вызывает System.loadLibrary("mylibrary"), а затем ваш MyLibrary.init(getAssets()).