Стандартный совет для получения JavaVM * в коде C ++ приложения Android состоит в том, чтобы иметь обработчик события для события OnLoad, например что-то вроде
JavaVM* g_jvm;
JNIEnv* g_env;
JNIEXPORT jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
g_jvm = jvm;
if (jvm->GetEnv((void**)&g_env, JNI_VERSION_1_6) != JNI_OK)
{
return -1;
}
return JNI_VERSION_1_6;
}
Предполагается, что библиотека C ++ будет загружена из модуля Kotlin или Java с помощью команды, подобной
System.loadLibrary("native-lib")
и затем будет вызван обработчик события OnLoad.
Но в приложении Xamarin библиотеки C ++ не загружаются из Kotlin, и обработчик событий JNI_OnLoad не вызывается.
Вместо этого я нашел способ получить код JavaVM * в C ++ в блоге здесь , но я не смог заставить его работать (ТАК вопрос здесь ).
Так что моей следующей идеей было включить Kotlin AAR в приложение Xamarin через библиотеку привязок Xamarin для Android. Код Kotlin загружает библиотеку оболочки C ++, которая получает JavaVM * через событие OnLoad и передает его в мой код Xamarin C ++.
У меня вопрос: кто-нибудь делал такой же сценарий, вызывая Java через JNI из кода C ++ приложения Xamarin.Android, и если да, то как вы включили JavaVM * в код C ++?