在 JNI_OnLoad 之前的 Android 本机代码中的全局对象构造函数中获取 Java VM 指针

Get Java VM pointer in global object constructor in Android native code before JNI_OnLoad

我在本机代码中有一个全局对象,需要在其构造函数中调用 Java 代码。通常要获取 JavaVM 指针,我会获取 in JNI_OnLoad 并将其缓存。

但全局对象构造函数在 JNI_OnLoad 之前被调用。而且由于您不能真正从 Android 本机代码调用 JNI_GetCreatedJavaVMsJNI_CreateJavaVM

有人知道如何在调用 JNI_OnLoad 之前获取 JavaVM 指针吗?

感谢您的帮助。

为了清楚起见,我们假设您有 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,但您必须以正确的顺序手动加载它们。