在 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_GetCreatedJavaVMs
或 JNI_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,但您必须以正确的顺序手动加载它们。
我在本机代码中有一个全局对象,需要在其构造函数中调用 Java 代码。通常要获取 JavaVM
指针,我会获取 in JNI_OnLoad
并将其缓存。
但全局对象构造函数在 JNI_OnLoad
之前被调用。而且由于您不能真正从 Android 本机代码调用 JNI_GetCreatedJavaVMs
或 JNI_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,但您必须以正确的顺序手动加载它们。