Android JNI本地引用表,转储当前状态

时间:2012-11-08 06:24:32

标签: android c++ java-native-interface

任何Android JNI开发人员都应该熟悉logcat中这条精彩的消息。我的问题是:如何告诉VM转储当前表状态?我需要它用于调试目的,以确保退出时的本机线程没有未完成的本地引用。

3 个答案:

答案 0 :(得分:9)

完全归功于Pavel,但我认为其他人可能会喜欢示例代码:

jclass vm_class = env->FindClass("dalvik/system/VMDebug");
jmethodID dump_mid = env->GetStaticMethodID( vm_class, "dumpReferenceTables", "()V" );
env->CallStaticVoidMethod( vm_class, dump_mid );

答案 1 :(得分:4)

如果有人需要做类似的事情,你可以使用 来自dalvik.system.VMDebug的dumpReferenceTables

答案 2 :(得分:3)

我尝试下面的代码。它效果很好。

try {
    Class cls = Class.forName("android.os.Debug");
    Method method = cls.getDeclaredMethod("dumpReferenceTables");
    Constructor con= cls.getDeclaredConstructor();
    con.setAccessible(true);
    method.invoke(con.newInstance());
    //call method dumpReferenceTables of dalvik.system.VMDebug
    //to dump reference table at last.
}
catch(Exception e){
    Log.i(TAG,"exception="+e.getMessage());
}

I / art(28913):全局参考表转储:

I / art(28913):最后10个条目(267):

I / art(28913):266:0x12e340c0 java.lang.ref.WeakReference

I / art(28913):265:0x12e34060 java.lang.ref.WeakReference

I / art(28913):264:0x12e24220 java.lang.ref.WeakReference

I / art(28913):263:0xa1ba5000 byte [](2710656个元素)

I / art(28913):262:0xa284d000 byte [](30276个元素)

I / art(28913):261:0xa2855000 byte [](19312个元素)

I / art(28913):260:0xa1e3b000 byte [](6529728个元素)

I / art(28913):259:0x12e1ca60 android.view.accessibility.AccessibilityManager $ 1

I / art(28913):258:0x12df2c70 android.content.ContentProvider $ Transport

I / art(28913):257:0x12ed4040 java.lang.ref.WeakReference

I / art(28913):摘要:

I / art(28913):android.opengl.EGLContext中的2个(2个唯一实例)

I / art(28913):1。android.hardware.display.DisplayManagerGlobal $ DisplayManagerCallback

I / art(28913):java.lang.Class的223(172个唯一实例)

I / art(28913):2。android.opengl.EGLDisplay(2个唯一实例)

I / art(28913):java.lang.ThreadGroup中的2个(2个唯一实例)

I / art(28913):2个android.opengl.EGLSurface(2个独特实例)

I / art(28913):dalvik.system.VMRuntime中的1个

I / art(28913):1。android.content.ContentProvider $ Transport

I / art(28913):dalvik.system.PathClassLoader中的1个

I / art(28913):1。android.view.accessibility.AccessibilityManager $ 1

I / art(28913):1。android.app.ActivityThread $ ApplicationThread

I / art(28913):2个byte [](100个元素)(2个唯一实例)

I / art(28913):7个byte [](8192个元素)(7个唯一实例)

I / art(28913):1个byte [](19312个元素)

I / art(28913):1个byte [](30276个元素)

I / art(28913):1个byte [](2710656个元素)

I / art(28913):1个byte [](6529728个元素)

I / art(28913):java.lang.String中的2个(2个唯一实例)

I / art(28913):java.lang.ref.WeakReference中的15个(15个唯一实例)