Android JNI本地参考表,转储当前状态
任何Android JNI开发人员都应该熟悉logcat中的这条精彩消息。我的问题是:如何告诉VM转储当前表状态?我需要它来进行调试,以确保出口处的本机线程没有未完成的本地引用。如果有人需要执行类似的操作,您可以使用Android JNI本地参考表,转储当前状态,android,c++,java-native-interface,Android,C++,Java Native Interface,任何Android JNI开发人员都应该熟悉logcat中的这条精彩消息。我的问题是:如何告诉VM转储当前表状态?我需要它来进行调试,以确保出口处的本机线程没有未完成的本地引用。如果有人需要执行类似的操作,您可以使用 dalvik.system.VMDebug中的dumpReferenceTables完全归功于Pavel,但我认为其他人可能会喜欢示例代码: jclass vm_class = env->FindClass("dalvik/system/VMDebug"); jmethodI
dalvik.system.VMDebug中的dumpReferenceTables完全归功于Pavel,但我认为其他人可能会喜欢示例代码:
jclass vm_class = env->FindClass("dalvik/system/VMDebug");
jmethodID dump_mid = env->GetStaticMethodID( vm_class, "dumpReferenceTables", "()V" );
env->CallStaticVoidMethod( vm_class, dump_mid );
我尝试下面的代码。它工作得很好
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字节[](2710656个元素) I/art(28913):262:0xa284d000字节[](30276个元素) I/art(28913):261:0xa2855000字节[](19312个元素) I/art(28913):260:0xa1e3b000字节[](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):android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback的1个 I/art(28913):223个java.lang.Class(172个唯一实例) I/art(28913):android.opengl.EGLDisplay的2个(2个唯一实例) I/art(28913):2个java.lang.ThreadGroup(2个唯一实例) I/art(28913):2个android.opengl.EGLSurface(2个独特实例) I/art(28913):dalvik.system.VMRuntime的1 I/art(28913):android.content.ContentProvider$Transport的1个 I/art(28913):dalvik.system.PathClassLoader的1 I/art(28913):android.view.accessibility.AccessibilityManager$1 I/art(28913):android.app.ActivityThread$ApplicationThread的1个 I/art(28913):字节[]的2个(100个元素)(2个唯一实例) I/art(28913):字节[]的7个(8192个元素)(7个唯一实例) I/art(28913):字节[](19312个元素)的1 I/art(28913):字节[](30276个元素)的1 I/art(28913):字节[](2710656个元素)的1 I/art(28913):字节[](6529728个元素)的1 I/art(28913):2个java.lang.String(2个唯一实例)
I/art(28913):java.lang.ref.WeakReference的15个(15个唯一实例)这对您有用吗?我找不到将参考表转储到日志的方法。是的,它工作得很好。这就是为什么我把它贴出来作为参考,以防有人需要这样做。检查VMDEUG文档,您需要从C++访问java代码,并且可以将JNI表转储到LogCATI,无法找到类Dalvik.St.VMDECG。你必须在你的项目中包含一些东西才能得到它吗?@Rafa这不是c/c++的东西。您必须
FindClass
,然后检索函数指针并使用JNI从c/c++调用它们。。。问题是我在Java方面看不到这个类。我只是想在那里做,但失败了。