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

我想知道JNI apis是否可以在当前JVM中列出所有当前可用的实例(作为jobject)。

我的意思是:

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

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

JVMTI会有所帮助。

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

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

 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); }