java - NDK如何获取dvm点?

标签 java android-ndk

现在我有一个使用“JNI_GetCreatedJavaVMs”的问题。

但我无法使用 JNI_OnLoad 方法,因为我的 native 代码不提供 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发生了什么。

谁能帮帮我!!!!!!!!!!!!谢谢

ps:JNI_GetCreatedJavaVMs方法在android源码中找到。

另一种方法是使用runtime(libart.so)或gdvm(libdvm.so)。

最佳答案

我的本​​机应用程序中的一些代码,它是在 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);

关于java - NDK如何获取dvm点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537442/

相关文章:

Android Studio CMake 错误 : Build Command failed

java - 如何将int与枚举匹配

android - 执行 DatabaseReference::RunTransaction 时是否可以将捕获值添加到 lambda?

java - 如何使用 Java 任务控制

java - 使用 Java Applet 用箭头键移动球

java - 为 Java 8 流编写单元测试

java - Android 6 棉花糖 ListView 。使用运行时权限启动 Activity

java - 可变大小键的 B 树实现

android - 无法获取 Crashlytics 中 native 崩溃的堆栈跟踪

c - 如何将字符缓冲区(带有 pcm 音频数据)转换为短缓冲区