ОШИБКА JNI (ошибка приложения): переполнение глобальной справочной таблицы (макс. = 51200) - PullRequest
0 голосов
/ 08 января 2020

У меня есть приложение медиаплеера. Когда я тестировал, я увидел, что мое приложение не работает. Чтобы понять причину, я использовал следующую команду, и она показала мне причину, однако я не понимаю, в чем проблема. Как я понимаю, я использовал слишком много глобальных переменных , но я не знаю, что это.

/ndk-stack -sym /Users/hilalinan/AndroidStudioProjects/player3/app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/armeabi-v7a -dump hilallogcat.txt

И это дамп cra sh:

********** Crash dump: **********
Build fingerprint: 'motorola/cedric/cedric:8.1.0/OPP28.85-19-4-2/3447de:user/release-keys'
Abort message: 'indirect_reference_table.cc:319] JNI ERROR (app bug): global reference table overflow (max=51200)'
#00 0x0001a3fa /system/lib/libc.so (abort+63)
#01 0x0035ce99 /system/lib/libart.so (art::Runtime::Abort(char const*)+392)
#02 0x0041ca0d /system/lib/libart.so (android::base::LogMessage::~LogMessage()+452)
#03 0x001d6e0b /system/lib/libart.so (art::IndirectReferenceTable::Add(art::IRTSegmentState, art::ObjPtr<art::mirror::Object>)+434)
#04 0x0024eff9 /system/lib/libart.so (art::JavaVMExt::AddGlobalRef(art::Thread*, art::ObjPtr<art::mirror::Object>)+36)
#05 0x0027faab /system/lib/libart.so (art::JNI::NewGlobalRef(_JNIEnv*, _jobject*)+374)
#06 0x000bc32f /system/lib/libandroid_runtime.so (JavaBBinder::JavaBBinder(_JNIEnv*, _jobject*)+90)
#07 0x000bb30b /system/lib/libandroid_runtime.so (JavaBBinderHolder::get(_JNIEnv*, _jobject*)+74)
#08 0x000bb1f5 /system/lib/libandroid_runtime.so (android::ibinderForJavaObject(_JNIEnv*, _jobject*)+72)
#09 0x000b30e9 /system/lib/libandroid_runtime.so (android::android_os_Parcel_writeStrongBinder(_JNIEnv*, _jclass*, long long, _jobject*)+32)
#10 0x007ffd8b /system/framework/arm/boot-framework.oat (offset 0x5e6000) (android.app.admin.SecurityLog.readEventsOnWrapping [DEDUPED]+130)
#11 0x0072fb23 /system/framework/arm/boot-framework.oat (offset 0x5e6000) (android.app.IApplicationThread$Stub$Proxy.scheduleCreateService+122)
#12 0x00657aed /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.am.ActiveServices.realStartServiceLocked+676)
#13 0x006559b9 /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.am.ActiveServices.bringUpServiceLocked+1816)
#14 0x0065ed1d /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.am.ActiveServices.bindServiceLocked+3948)
#15 0x006a3b37 /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.am.ActivityManagerService.bindService+446)
#16 0x006c1571 /system/framework/arm/boot-framework.oat (offset 0x5e6000) (android.app.ContextImpl.bindServiceCommon+584)
#17 0x006c4eeb /system/framework/arm/boot-framework.oat (offset 0x5e6000) (android.app.ContextImpl.bindServiceAsUser+98)
#18 0x00f42d55 /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.job.JobServiceContext.executeRunnableJob+1092)
#19 0x00f33999 /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.job.JobSchedulerService.assignJobsToContextsLocked+1992)
#20 0x00f2f15d /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.job.JobSchedulerService$JobHandler.handleMessage+3252)
#21 0x0066e77b /system/framework/arm/boot-framework.oat (offset 0x5e6000) (android.os.Handler.dispatchMessage+138)
#22 0x00d873bd /system/framework/arm/boot-framework.oat (offset 0x5e6000) (android.os.Looper.loop+1068)
#23 0x006377d9 /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.SystemServer.run+2704)
#24 0x00636527 /system/framework/oat/arm/services.odex (offset 0x606000) (com.android.server.SystemServer.main+230)
#25 0x00403375 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
#26 0x004085eb /system/lib/libart.so (art_quick_invoke_static_stub+226)
#27 0x000b00df /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+174)
#28 0x0035769d /system/lib/libart.so (art::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::ArgArray*, art::JValue*, char const*)+52)
#29 0x00358bbb /system/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+954)
#30 0x00308645 /system/lib/libart.so (art::Method_invoke(_JNIEnv*, _jobject*, _jobject*, _jobject*)+40)
#31 0x002389ff /system/framework/arm/boot-core-oj.oat (offset 0x1cb000) (java.lang.Class.getDeclaredMethodInternal [DEDUPED]+110)
#32 0x01320583 /system/framework/arm/boot-framework.oat (offset 0x5e6000) (com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run+114)
#33 0x01327e0b /system/framework/arm/boot-framework.oat (offset 0x5e6000) (com.android.internal.os.ZygoteInit.main+2282)
#34 0x00403375 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
#35 0x004085eb /system/lib/libart.so (art_quick_invoke_static_stub+226)
#36 0x000b00df /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+174)
#37 0x0035769d /system/lib/libart.so (art::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::ArgArray*, art::JValue*, char const*)+52)
#38 0x0035748d /system/lib/libart.so (art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list)+304)
#39 0x002a611b /system/lib/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, std::__va_list)+414)
#40 0x0006c50b /system/lib/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+30)
#41 0x0006de83 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vector<android::String8> const&, bool)+450)
#42 0x00001b75 /system/bin/app_process32 (main+764)
#43 0x0007674d /system/lib/libc.so (__libc_init+48)
#44 0x00001798 /system/bin/app_process32 (_start_main+88)
Crash dump is completed

Я пытаюсь понять, где проблема. Связано ли это с папкой моего макета, я понятия не имею.

Этот пример взят из моего кода, интересно, имеет ли он какое-то отношение к проблеме Global Reference.

private void writeLogFile()
{
    Timber.log(Log.DEBUG, "writeLogFile Thread.currentThread().getName() " + Thread.currentThread().getName());

    try {

        directoryToStore = getBaseContext().getFilesDir();
        //File yourFile = new File( yourFilePath );
        if (!directoryToStore.exists()) {
            if (directoryToStore.mkdir())
            {
                Timber.tag("directoryToStore").w("" + directoryToStore.getAbsolutePath());
            }
        }

        Timber.tag("before").w("Logcat save");
        //Process process;
        Timber.tag("getFilesDir()").w("" + directoryToStore.getAbsolutePath() + "/Logging.txt");
        //String[] command = new String[] { "logcat", "-d", "-v", "threadtime" };
        StringBuilder logBuilder = new StringBuilder();

        //process = Runtime.getRuntime().exec( "logcat *:D -f "+directoryToStore.getAbsolutePath()+"/Logging.txt");
        process = Runtime.getRuntime().exec( "logcat -d");
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            logBuilder.append(line + "\n");
        }



        logs =  logBuilder.toString();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я использование панели уведомлений с IMPORTANCE_HIGH приоритетом.

Любая помощь будет очень признательна.

Заранее спасибо.

...