2016-04-06 17 views
1

JNI APIを使用して、現在のJVMのすべての現在使用可能なインスタンス(jobjectとして)をリストすることが可能かどうかを知りたいと思います。私が言いたいのJNI、現在のインスタンスをすべて一覧表示するにはどうすればいいですか?

例:私のタスクは、特定のインターフェース(env->IsInstanceOf())を実装するオブジェクトのためにそれらを検索することです

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

、私はクラス名

+6

「Javaで特定のクラスのすべてのオブジェクトインスタンスを取得する簡単な方法はありますか」(http://stackoverflow.com/questions/1947122/)を参照してください。 –

+0

この質問にも同様のタイトルがありますが、参照される質問は1)古くなっている、2)JNIに関するものではない、3)正確な回答がないため、重複とは限りません。 – apangin

答えて

3
なく、動的かつグローバルこれをしなければなりません

JVMTIが役に立ちます。

  1. IterateOverInstancesOfClassを呼び出すと、必要なすべてのオブジェクトにタグを付けることができます。
  2. アレイにすべてのタグ付きオブジェクトをコピーするには、GetObjectsWithTagsを呼び出します。

これは例です。 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); 
} 
関連する問題