#android #android-ndk #java-native-interface
#Android #android-ndk #java-native-interface
Вопрос:
Мы используем Android NDK для написания библиотеки c на Android, и для библиотеки необходимо использовать JavaVM и AAssetManager. Проблема в том, что мы не находим способа получить доступ к JavaVM и AAssetManager внутри нашей библиотеки.
Что я знаю, так это:
- В собственном хост-приложении мы можем получить их из ANativeActivity
AAssetManager_fromJava
если javajint 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())
.