现在我有一个问题要使用" JNI_GetCreatedJavaVMs"。
但是我无法使用JNI_OnLoad方法,因为我的本机代码不是为java提供的。
void *pHandle = dlopen("/system/lib/libart.so", RTLD_NOW | RTLD_GLOBAL);
JavaVM* m_pJvm = NULL;
void * pFunAddr =dlsym(pHandle, "JNI_GetCreatedJavaVMs");
LOGD("pJNI_GetCreatedJavaVMs = %08X", pFunAddr);
pJNIGetCreatedJavaVMs = (int)pFunAddr - 1;
LOGD("call !!!!!!!");
pJNIGetCreatedJavaVMs(&m_pJvm, 0, &vm_count);
LOGD("pJNIGetCreatedJavaVMs result is %d", result);
当我调用JNI_GetCreatedJavaVMs时,进程崩溃了。
我没有发现IDA发生的事情。
谁能帮助我!!!!!!!!!!!!!! THX
ps:在Android源代码中找到JNI_GetCreatedJavaVMs方法。
另一种方法是使用runtime(libart.so)或gdvm(libdvm.so)。
答案 0 :(得分:1)
我的原生应用程序中的一些代码,它是在AOSP源代码树中构建的。
我不确定它是否可以在NDK中使用
#include <jni.h>
#include <android_runtime/AndroidRuntime.h>
...
JNIEnv *env;
jint res;
JavaVM *jvm = AndroidRuntime::getJavaVM();
assert(jvm != NULL);
res = jvm->AttachCurrentThread(&env, NULL);
assert(res >= 0);