Как получить указатель JavaVM в модуле C ++ приложения Xamarin.Android? - PullRequest
0 голосов
/ 30 мая 2019

Стандартный совет для получения 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 ++?

...