帮助解密logcat输出-过度的JNI全局引用

本文关键字:JNI 全局 引用 解密 logcat 输出 帮助 | 更新日期: 2023-09-27 17:59:23

有人能告诉我是什么导致我的应用程序中止并给出这个输出吗?

I/ActivityManager(   68): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=MapDroid.MapDroid/mapdroid.StudentList } from pid 223
I/ActivityManager(   68): Start proc MapDroid.MapDroid for activity MapDroid.MapDroid/mapdroid.StudentList: pid=506 uid=10036 gids={3003}
I/ActivityThread(  506): Pub MapDroid.MapDroid.__mono_init__: mono.MonoRuntimeProvider
D/dalvikvm(  506): Trying to load lib /data/data/MapDroid.MapDroid/lib/libmonodroid.so 0x40512d80
D/dalvikvm(  506): Added shared lib /data/data/MapDroid.MapDroid/lib/libmonodroid.so 0x40512d80
D/dalvikvm(  506): GC_CONCURRENT freed 1219K, 57% free 2906K/6727K, external 1625K/2137K, paused 19ms+5ms
I/ActivityManager(   68): Displayed MapDroid.MapDroid/mapdroid.StudentList: +16s949ms
D/dalvikvm(  223): GC_EXPLICIT freed 41K, 50% free 2940K/5767K, external 5937K/7285K, paused 88ms
D/dalvikvm(  506): GC_EXPLICIT freed 177K, 56% free 2976K/6727K, external 1671K/2137K, paused 71ms
D/dalvikvm(  506): GC_FOR_MALLOC freed 2K, 56% free 2974K/6727K, external 1671K/2137K, paused 50ms
I/dalvikvm-heap(  506): Grow heap (frag case) to 7.125MB for 22008-byte allocation
D/dalvikvm(  506): GC_FOR_MALLOC freed 0K, 56% free 2995K/6791K, external 1671K/2137K, paused 72ms
D/dalvikvm(  506): GREF has increased to 201
D/dalvikvm(  506): GREF has increased to 301
D/dalvikvm(  506): GREF has increased to 401
D/dalvikvm(  506): GREF has increased to 501
D/dalvikvm(  506): GREF has increased to 601
D/dalvikvm(  506): GREF has increased to 701
D/dalvikvm(  506): GREF has increased to 801
D/dalvikvm(  506): GREF has increased to 901
D/dalvikvm(  506): GREF has increased to 1001
D/dalvikvm(  506): GREF has increased to 1101
D/dalvikvm(  506): GREF has increased to 1201
D/dalvikvm(  506): GREF has increased to 1301
D/dalvikvm(  506): GREF has increased to 1401
D/dalvikvm(  506): GREF has increased to 1501
D/dalvikvm(  506): GREF has increased to 1601
D/dalvikvm(  506): GREF has increased to 1701
D/dalvikvm(  506): GREF has increased to 1801
D/dalvikvm(  506): GREF has increased to 1901
D/dalvikvm(  506): GREF has increased to 2001
W/dalvikvm(  506): Last 10 entries in JNI global reference table:
W/dalvikvm(  506):  1991: 0x40567bf0 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1992: 0x40567c00 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1993: 0x40567b60 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1994: 0x40567b70 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1995: 0x40567b80 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1996: 0x40561ab8 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1997: 0x40561ac8 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1998: 0x40561ad8 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  1999: 0x4055eef0 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506):  2000: 0x4055ef00 cls=Lmono/android/runtime/JavaObject; (12 bytes)
W/dalvikvm(  506): JNI global reference table summary (2001 entries):
W/dalvikvm(  506):    50 of Ljava/lang/Class; 164B (40 unique)
W/dalvikvm(  506):    47 of Ljava/lang/Class; 188B (17 unique)
W/dalvikvm(  506):     6 of Ljava/lang/Class; 212B (6 unique)
W/dalvikvm(  506):    11 of Ljava/lang/Class; 236B (6 unique)
W/dalvikvm(  506):     2 of Ljava/lang/Class; 260B (2 unique)
W/dalvikvm(  506):     5 of Ljava/lang/Class; 284B (2 unique)
W/dalvikvm(  506):     6 of Ljava/lang/Class; 308B (5 unique)
W/dalvikvm(  506):     3 of Ljava/lang/Class; 332B (2 unique)
W/dalvikvm(  506):     1 of Ljava/lang/Class; 356B
W/dalvikvm(  506):     2 of Ljava/lang/Class; 380B (1 unique)
W/dalvikvm(  506):     2 of Ljava/lang/Class; 428B (2 unique)
W/dalvikvm(  506):     1 of Ljava/lang/Class; 452B
W/dalvikvm(  506):     1 of Ljava/lang/Class; 476B
W/dalvikvm(  506):     1 of Ljava/lang/Class; 500B
W/dalvikvm(  506):     1 of Ljava/lang/Class; 548B
W/dalvikvm(  506):     1 of Ljava/lang/Class; 572B
W/dalvikvm(  506):     2 of Ljava/lang/Class; 596B (2 unique)
W/dalvikvm(  506):     1 of Ljava/lang/Class; 692B
W/dalvikvm(  506):     1 of Ljava/lang/Class; 1004B
W/dalvikvm(  506):     2 of Ljava/lang/Class; 1172B (2 unique)
W/dalvikvm(  506):     1 of Ljava/lang/Class; 1316B
W/dalvikvm(  506):     1 of Ljava/lang/Class; 3452B
W/dalvikvm(  506):     1 of Ljava/lang/String; 28B
W/dalvikvm(  506):     2 of Ldalvik/system/VMRuntime; 12B (1 unique)
W/dalvikvm(  506):     9 of Ljava/lang/ref/WeakReference; 28B (9 unique)
W/dalvikvm(  506):     1 of Ljava/lang/ref/WeakReference; 36B
W/dalvikvm(  506):     1 of Ldalvik/system/PathClassLoader; 44B
W/dalvikvm(  506):     1 of Landroid/app/ActivityThread$ApplicationThread; 28B
W/dalvikvm(  506):     1 of Landroid/content/ContentProvider$Transport; 28B
W/dalvikvm(  506):     1 of Landroid/view/inputmethod/InputMethodManager$ControlledInputConnectionWrapper; 36B
W/dalvikvm(  506):     1 of Landroid/view/ViewRoot$1; 12B
W/dalvikvm(  506):     1 of Landroid/view/ViewRoot$W; 28B
W/dalvikvm(  506):     1 of Landroid/view/inputmethod/InputMethodManager$1; 28B
W/dalvikvm(  506):     1 of Landroid/view/accessibility/AccessibilityManager$1; 28B
W/dalvikvm(  506):     2 of Lorg/apache/harmony/xnet/provider/jsse/TrustManagerImpl; 28B (1 unique)
W/dalvikvm(  506):     1 of Lmapdroid/StudentList_GetStudentsTask; 28B
W/dalvikvm(  506):  1099 of Lmono/android/runtime/JavaObject; 12B (1099 unique)
W/dalvikvm(  506):   729 of Lmono/android/runtime/JavaObject; 20B (729 unique)
W/dalvikvm(  506):     1 of Lmapdroid/StudentList; 180B
W/dalvikvm(  506): Memory held directly by tracked refs is 58440 bytes
E/dalvikvm(  506): Excessive JNI global references (2001)
E/dalvikvm(  506): VM aborting
D/Zygote  (   33): Process 506 exited cleanly (1)
I/ActivityManager(   68): Process MapDroid.MapDroid (pid 506) has died.
I/WindowManager(   68): WIN DEATH: Window{406a8598 MapDroid.MapDroid/mapdroid.StudentList paused=false}
W/InputManagerService(   68): Got RemoteException sending setActive(false) notification to pid 506 uid 10036

StudentList.cs代码

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoMap;
using MonoMap.wsMobile;
namespace MapDroid
{
    public class StudentList : Activity
    {
        private int currentFacultyId = 93306;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            //Show Loading Layout
            SetContentView(Resource.Layout.SplashLoad);
            // init AsycTask and Execute
            GetStudentsTask gstask = new GetStudentsTask(this, currentFacultyId);
            gstask.Execute();
        }
        /***
         * Callback after GetStudentsTask completes
         * 
         **/
        protected void ShowList(ArrayAdapter<Student> adapter)
        {
            SetContentView(Resource.Layout.LayoutStudentList);
            //Grab Views
            ListView lvStudent = FindViewById<ListView>(Resource.Id.studentListView);
            EditText etFilter = FindViewById<EditText>(Resource.Id.studentFilter);
            //Attach Adapter to ListView
            lvStudent.Adapter = adapter;
            //Use delegate to filter list on TextChanged
            etFilter.TextChanged += delegate(object sender, Android.Text.TextChangedEventArgs e)
            {
                adapter.Filter.InvokeFilter(e.Text.ToString());
            };
            //Use delagate to fire intent on ItemClick
            lvStudent.ItemClick += delegate(object sender, ItemEventArgs args)
            {
                Student selectedStudent = adapter.GetItem(args.Position);
                Intent intent = new Intent(this, typeof(TabbedView));
                intent.PutExtra("studentId", selectedStudent.I.ToString());
                intent.PutExtra("studentName", selectedStudent.F.ToString() + " " + selectedStudent.L.ToString());
                intent.PutExtra("facultyId", currentFacultyId.ToString());
                StartActivity(intent);
            };  
        }
        /**
         * AsycTask Implementation to Get All Associated Students
         * 
         */ 
        internal class GetStudentsTask : AsyncTask
        {
            private ArrayAdapter<Student> _adapter;
            private StudentList _outer;
            private int _facId;
            public GetStudentsTask(StudentList outer, int currentFacultyId)
            {
                this._outer = outer;
                this._facId = currentFacultyId;
            }
            protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
            {
                //Setup Adapter Data Source
                Student[] students = WebService.GetStudentListbyFacultyId(_facId);
                _adapter = new ArrayAdapter<Student>(_outer, Resource.Layout.ItemStudent, students);
                return true;
            }
            protected override void OnPostExecute(Java.Lang.Object result)
            {
                _outer.ShowList(_adapter);
                base.OnPostExecute(result);
            }
        }
    }
}

另一个奇怪的问题是,它在实际设备上运行得很干净,但在模拟器上运行时,它会给我这个输出并中止。。。

想法?

帮助解密logcat输出-过度的JNI全局引用

模拟器的全局引用限制为2000。在设备上,如果我回忆正确的话,它大约是52000。你正在做的事情就是创造并抓住过多的物体。