Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JNI本地参考表,转储当前状态_Android_C++_Java Native Interface - Fatal编程技术网

Android JNI本地参考表,转储当前状态

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

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

如果有人需要执行类似的操作,您可以使用
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方面看不到这个类。我只是想在那里做,但失败了。