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())的对象,我必须动态且全局地执行此操作,而无需类名
JVMTI将提供帮助。
IterateOverInstancesOfClass以标记所有必需的对象;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)
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |