【问题标题】:Android JNI local reference table, dump current stateAndroid JNI 本地引用表,转储当前状态
【发布时间】:2018-05-27 04:22:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    感谢 Pavel,但我认为其他人可能会喜欢示例代码:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这对你有用吗?我找不到将引用表转储到日志的方法。
      • 是的,效果很好。这就是为什么我发布它以供参考,以防有人需要做类似的事情。检查 VMDebug 的文档,您需要从 c++ 访问 java 代码,您将能够将 JNi 表转储到 logcat
      • 我找不到类 dalvik.system.VMDebug。您是否必须在项目中包含某些内容才能获得它?
      • @Rafa 这不是 c/c++ 的东西。您必须FindClass,然后检索函数指针并使用 JNI 从 c/c++ 调用它们。
      • 我明白...问题是我在 Java 端看不到这个类。我只是想在那里做,但它失败了。
      【解决方案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 of android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback

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

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

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

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

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

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

      I/art (28913): 1 of dalvik.system.PathClassLoader

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

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

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

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        相关资源
        最近更新 更多