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

Sam*_*Sam 1 c++ java java-native-interface

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

我的意思示例:

jvm->AttachCurrentThreadAsDaemon((void**)&env,0);
jobject* instances;
int count = env->GetInstances(&instances);
Run Code Online (Sandbox Code Playgroud)

我的任务是在它们中搜索实现特定interface(env->IsInstanceOf())的对象,我必须动态且全局地执行此操作,而无需类名

apa*_*gin 6

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);
}
Run Code Online (Sandbox Code Playgroud)