android 视频硬解码异常 weak global reference table overflow

新手上路,请多包涵

我在安卓app中,采用采用海康相机预览视频,采用硬解码,运行5分钟后,就报如下错误:
A/art: art/runtime/indirect_reference_table.cc:98] JNI ERROR (app bug): weak global reference table overflow (max=51200)

art/runtime/indirect_reference_table.cc:98] weak global reference table dump:

art/runtime/indirect_reference_table.cc:98] Last 10 entries (of 51200):

art/runtime/indirect_reference_table.cc:98] 51199: 0x1319a220 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51198: 0x1319a1c0 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51197: 0x1319a160 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51196: 0x1319a100 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51195: 0x130f8fa0 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51194: 0x130f8f40 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51193: 0x130f8ee0 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51192: 0x130f8e80 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51191: 0x130f8e20 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] 51190: 0x130f8dc0 java.lang.Thread

art/runtime/indirect_reference_table.cc:98] Summary:

art/runtime/indirect_reference_table.cc:98] cleared jweak (count=0)

art/runtime/indirect_reference_table.cc:98] 1 of java.lang.Thread

art/runtime/indirect_reference_table.cc:98] cleared jweak (count=0)

art/runtime/indirect_reference_table.cc:98] 3 of android.media.MediaCodec (3 unique instances)

art/runtime/indirect_reference_table.cc:98] 4512 of java.lang.Class (4512 unique instances)

art/runtime/indirect_reference_table.cc:98] 1 of java.lang.ThreadGroup

art/runtime/indirect_reference_table.cc:98] 933 of java.lang.Thread (933 unique instances)

art/runtime/indirect_reference_table.cc:98]
E/相机播放SDK:: inputData failed with: 11, i:0

E/相机播放SDK:: inputData failed with: 11, i:0

E/相机播放SDK:: inputData failed with: 11, i:0

E/相机播放SDK:: inputData failed with: 11, i:100

E/相机播放SDK:: inputData failed with: 11, i:100

E/相机播放SDK:: inputData failed with: 11, i:100

E/相机播放SDK:: inputData failed with: 11, i:200

E/相机播放SDK:: inputData failed with: 11, i:200

E/相机播放SDK:: inputData failed with: 11, i:200

E/相机播放SDK:: inputData failed with: 11, i:300

E/相机播放SDK:: inputData failed with: 11, i:300

E/相机播放SDK:: inputData failed with: 11, i:300

E/相机播放SDK:: inputData failed with: 11, i:400

E/相机播放SDK:: inputData failed with: 11, i:400

E/相机播放SDK:: inputData failed with: 11, i:400

E/相机播放SDK:: inputData failed with: 11, i:500

I/HCNetSDK: 2021-10-19 10:01:33.987 ID-IP-CHAN[0-192.168.1.66-1] [CGetStreamBase::DoExchange] recv timeout[2], m_bReConnecting[0], maxtimes[6]!

I/HCNetSDK: 2021-10-19 10:01:33.987 ID-IP-CHAN[1-192.168.1.64-1] [CGetStreamBase::DoExchange] recv timeout[2], m_bReConnecting[0], maxtimes[6]!

I/HCNetSDK: 2021-10-19 10:01:33.988 ID-IP-CHAN[2-192.168.1.65-1] [CGetStreamBase::DoExchange] recv timeout[2], m_bReConnecting[0], maxtimes[6]!

E/art: Unexpected time out during dump checkpoint.

A/art: art/runtime/barrier.cc:89] Check failed: !count_ Attempted to destroy barrier with non zero count

A/art: art/runtime/runtime.cc:298] Runtime aborting --- recursively, so no thread-specific detail!

art/runtime/runtime.cc:298]
A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 8063 (Thread-46930)

硬解码部分代码,显示视频直接采用的surfaceview

private void processRealData(int iPlayViewNo, int iDataType, byte[] pDataBuffer, int iDataSize, int iStreamMode) {

    if (HCNetSDK.NET_DVR_SYSHEAD == iDataType) {
        if (m_iPort >= 0) {
            return;
        }
        m_iPort = Player.getInstance().getPort();
        if (m_iPort == -1) {
            Log.e(TAG, "getPort is failed with: " + Player.getInstance().getLastError(m_iPort));
            return;
        }
        Log.i(TAG, "getPort succ with: " + m_iPort);
        if (iDataSize > 0) {
            if (!Player.getInstance().setStreamOpenMode(m_iPort, iStreamMode)) //set stream mode
            {
                Log.e(TAG, "setStreamOpenMode failed");
                return;
            }
            if (!Player.getInstance().openStream(m_iPort, pDataBuffer, iDataSize, 4 * 1024 * 1024)) //open stream
            {
                Log.e(TAG, "openStream failed");
                return;
            }

            if(bCheckHD)
            {
                Player.getInstance().setHardDecode(m_iPort, 1);
            }

            while (!m_bSurfaceCreated) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Log.i(TAG, "wait 100 for surface, handle:" + iPlayViewNo);
            }

            if (!Player.getInstance().play(m_iPort, getHolder())) {
                Log.e(TAG, "play failed,error:" + Player.getInstance().getLastError(m_iPort));
                return;
            }
        }
    } else {
     
        for (int i = 0; i < 2000; i++) {
            if (!Player.getInstance().inputData(m_iPort, pDataBuffer, iDataSize)) {
                Log.e(TAG, "inputData failed with: " + Player.getInstance().getLastError(m_iPort));
            } else {
                break;
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

请问报错为jni 弱引用表溢出,要怎么解决呢?

阅读 2.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题