Получить указатель виртуальной машины Java в конструкторе глобальных объектов в собственном коде Android до JNI_OnLoad - PullRequest
0 голосов
/ 09 мая 2018

У меня есть глобальный объект в нативном коде, который должен вызывать код Java в его конструкторе. Обычно, чтобы получить указатель JavaVM, я получаю вход JNI_OnLoad и кеширую его.

Но конструктор глобального объекта вызывается раньше JNI_OnLoad. И так как вы не можете действительно звонить JNI_GetCreatedJavaVMs или JNI_CreateJavaVM из собственного кода Android.

Кто-нибудь знает, как получить указатель JavaVM до вызова JNI_OnLoad?

Ваша помощь приветствуется.

1 Ответ

0 голосов
/ 09 мая 2018

Для ясности предположим, что у вас есть libziron.so , в котором есть глобальный объект с конструктором, которому требуется JavaVM* vm.

Создайте другую библиотеку, lib1.so , которая будет иметь только

JavaVM* g_vm;

jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{
    g_vm = vm;
    return JNI_VERSION_1_4;
}

В Java вы загружаете lib1.so и после этого libziron.so . В libziron.so теперь вы можете получить доступ к extern g_vm . Обратите внимание, что хотя libziron.so зависит от lib1.so , их необходимо загружать вручную, в правильном порядке.

...