gpt4 book ai didi

java - JNI,如何列出所有当前实例?

转载 作者:行者123 更新时间:2023-11-30 00:46:58 25 4
gpt4 key购买 nike

我想知道是否可以使用 JNI api 列出当前 JVM 中的所有当前可用实例(如 jobject)。

我的意思的例子:

jvm->AttachCurrentThreadAsDaemon((void**)&env,0);
jobject* instances;
int count = env->GetInstances(&instances);

我的任务是通过它们搜索实现特定接口(interface)的对象(env->IsInstanceOf()),我必须在没有类名的情况下动态地全局执行此操作

最佳答案

JVMTI会有帮助。

  1. 调用IterateOverInstancesOfClass标记所有必需的对象;
  2. 调用GetObjectsWithTags将所有标记的对象复制到 jobject* 数组。

这是一个例子。请注意,targetClass 也可以是一个接口(interface)。

static jvmtiIterationControl JNICALL
HeapObjectCallback(jlong class_tag, jlong size, jlong* tag_ptr, void* user_data) {
*tag_ptr = 1;
return JVMTI_ITERATION_CONTINUE;
}

JNIEXPORT void JNICALL
Java_Test_iterateInstances(JNIEnv* env, jclass ignored, jclass targetClass) {
JavaVM* vm;
env->GetJavaVM(&vm);

jvmtiEnv* jvmti;
vm->GetEnv((void**)&jvmti, JVMTI_VERSION_1_0);

jvmtiCapabilities capabilities = {0};
capabilities.can_tag_objects = 1;
jvmti->AddCapabilities(&capabilities);

jvmti->IterateOverInstancesOfClass(targetClass, JVMTI_HEAP_OBJECT_EITHER,
HeapObjectCallback, NULL);

jlong tag = 1;
jint count;
jobject* instances;
jvmti->GetObjectsWithTags(1, &tag, &count, &instances, NULL);

printf("Found %d objects with tag\n", count);

jvmti->Deallocate((unsigned char*)instances);
}

关于java - JNI,如何列出所有当前实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36458490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com