Получить JavaVM и AAssetManager в собственной библиотеке c для Android

#android #android-ndk #java-native-interface

#Android #android-ndk #java-native-interface

Вопрос:

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

Что я знаю, так это:

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

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

Ответ №1:

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

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

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

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