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

 2023-01-19    365  

问题描述

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

我的意思示例:

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

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

我的任务是通过它们搜索实现特定接口(env->IsInstanceOf())的对象,我必须在不使用类名称的情况下动态和全球进行此操作

推荐答案

jvmti /p>

  1. 调用 IterateOverInstancesOfClass IterateOverInstancesOfClass 所有必需的对象;
  2. call GetObjectsWithTags 复制所有标记为jobject* array的对象.

这是一个示例.请注意,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);
}

以上所述是小编给大家介绍的JNI, 如何列出当前所有的实例?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25876.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。