在SurfaceView中调用unlockCanvasAndPost之后的Android IllegalArgumentException和致命信号6(SIGABRT)

时间:2016-07-20 17:13:29

标签: java android multithreading canvas surfaceview

我无法为我的生活找出这个问题。任何帮助将不胜感激。

我有一个名为AndroidFastRenderView的课程,其扩展SurfaceView并实施Runnable。线程被创建一次,它应该被绘制到SurfaceView上直到它被破坏。从下面的代码中可以看出,我正在检查以确保SurfaceView的持有者具有有效的Surface,并且在尝试绘制Canvas之前可以锁定它。但是,在尝试调用IllegalArgumentException时仍然会得holder.unlockCanvasAndPost()(如果画布尚未锁定,则永远不会调用它)。

07-19 17:38:32.350 E/Surface: queueBuffer (handle=0x7ffeec230f50) failed (Operation not permitted)
07-19 17:38:32.350 E/AndroidRuntime: FATAL EXCEPTION: Thread-4
    Process: com.mycompany.myapp, PID: 10103
    java.lang.IllegalArgumentException
        at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
        at android.view.Surface.unlockSwCanvasAndPost(Surface.java:331)
        at android.view.Surface.unlockCanvasAndPost(Surface.java:312)
        at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:954)
        at com.mycompany.framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:109)
        at java.lang.Thread.run(Thread.java:761)

这引起了一些非常奇怪的行为。首先,它导致Fatal error 6 (SIGABRT),这完全没有用。这是它的样子:

07-19 17:38:32.350 A/libc: Invalid address 0x7ffed9d58400 passed to free: value not allocated
07-19 17:38:32.350 A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 10136 (Thread-4)

但是,我怀疑此错误是无关的,因为当我尝试使用SIGABRT播放音乐时,我也收到此MediaPlayer消息。这些错误消息看起来非常相似:

07-19 17:27:43.736 A/libc: Invalid address 0x7ffed8395000 passed to free: value not allocated
07-19 17:27:43.736 A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 9906 (NDK MediaCodec_)
07-19 17:27:43.737 A/libc: Invalid address 0x7ffed83a9400 passed to free: value not allocated
07-19 17:27:43.737 A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 9882 (SoundPoolThread)

在这两种情况下,我都会收到一些关于缓冲区的奇怪错误消息。

07-19 17:38:33.693 1246-1246/? E/Layer: rejecting buffer: bufWidth=1777, bufHeight=1077, front.active.{w=225, h=225}
07-19 17:38:33.791 1246-1246/? E/Layer: rejecting buffer: bufWidth=1664, bufHeight=1077, front.active.{w=225, h=225}

由于某种原因,我无法理解,当我注释掉调用holder.lockCanvas()的单行时,这些错误完全消失了(但当然屏幕是空白的!)。我只想说我完全傻眼了。我已经做了好几天了,我已经取得了一些进展。

以下是我run课程中AndroidFastRenderView方法的代码。

@Override
public void run() {
    while(running && !Thread.currentThread().isInterrupted()) {
        if (!holder.getSurface().isValid())
            continue;

        float deltaTime = (System.nanoTime() - startTime) / 10000000.000f;
        startTime = System.nanoTime();

        if (deltaTime > 5) {
            deltaTime = (float) 5;
        }

        game.getCurrentScreen().update(deltaTime);
        game.getCurrentScreen().paint(deltaTime);

        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
        } catch (Exception e) {
            Log.d(LOG_TAG, "Failed to lock canvas.");
        }
        if (canvas != null) {
            synchronized (holder) {
                if (dstRect.right == 1 && dstRect.bottom == 1) {
                    dstRect.right = canvas.getWidth();
                    dstRect.bottom = canvas.getHeight();
                }

                // canvas.getClipBounds(dstRect);
                // canvas.drawARGB(255, 0, 0, 0);
                canvas.drawBitmap(bgFrameBuffer.getBitmap(), null, dstRect, paint);
                canvas.drawBitmap(mainFrameBuffer.getBitmap(), null, dstRect, paint);
                canvas.drawBitmap(fgFrameBuffer.getBitmap(), null, dstRect, paint);

                holder.unlockCanvasAndPost(canvas); /* <-- the line that throws the IllegalArgumentException */
            }
        }
    }
}

这里有足够的灵魂足以筛选垃圾的完整logcat。

07-19 17:38:28.529 10103-10136/com.mycompany.myapp D/MyAppDebug: Assets loaded!
07-19 17:38:28.529 10103-10136/com.mycompany.myapp D/MyAppDebug: Counter1
07-19 17:38:28.550 10103-10138/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:28.833 10103-10141/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:29.090 1246-1246/? E/Layer: [Starting com.mycompany.myapp] rejecting buffer: bufWidth=1440, bufHeight=2392, front.active.{w=1, h=1}
07-19 17:38:29.106 10103-10144/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:29.251 3951-3986/system_process I/WindowManager: Screen frozen for +3s679ms due to Window{c73d173 u0 Starting com.mycompany.myapp}
07-19 17:38:29.432 10103-10147/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:29.491 10103-10151/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:30.048 10103-10154/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:30.536 10103-10157/com.mycompany.myapp I/OMXClient: MuxOMX ctor
07-19 17:38:32.350 10103-10136/com.mycompany.myapp E/Surface: queueBuffer: error queuing buffer to SurfaceTexture, -1
07-19 17:38:32.350 10103-10136/com.mycompany.myapp E/Surface: queueBuffer (handle=0x7ffeec230f50) failed (Operation not permitted)
07-19 17:38:32.350 10103-10136/com.mycompany.myapp E/AndroidRuntime: FATAL EXCEPTION: Thread-4
                                                                           Process: com.mycompany.myapp, PID: 10103
                                                                           java.lang.IllegalArgumentException
                                                                               at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
                                                                               at android.view.Surface.unlockSwCanvasAndPost(Surface.java:331)
                                                                               at android.view.Surface.unlockCanvasAndPost(Surface.java:312)
                                                                               at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:954)
                                                                               at com.mycompany.framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:109)
                                                                               at java.lang.Thread.run(Thread.java:761)
07-19 17:38:32.350 10103-10136/com.mycompany.myapp A/libc: Invalid address 0x7ffed9d58400 passed to free: value not allocated
07-19 17:38:32.350 10103-10136/com.mycompany.myapp A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 10136 (Thread-4)

                                                                 [ 07-19 17:38:32.350  1181: 1181 W/         ]
                                                                 debuggerd: handling request: pid=10103 uid=10081 gid=10081 tid=10136
07-19 17:38:32.376 10160-10160/? A/DEBUG: pid: 10103, tid: 10136, name: Thread-4  >>> com.mycompany.myapp <<<
07-19 17:38:32.878 3951-3986/system_process I/ActivityManager: Displayed com.mycompany.myapp/.MyAppPaid: +7s536ms
07-19 17:38:33.073 3951-3986/system_process I/WindowManager: Destroying surface Surface(name=Starting com.mycompany.myapp) called by com.android.server.wm.WindowStateAnimator.destroySurface:1992 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:885 com.android.server.wm.WindowState.destroyOrSaveSurface:2065 com.android.server.wm.AppWindowToken.destroySurfaces:359 com.android.server.wm.WindowStateAnimator.finishExit:558 com.android.server.wm.WindowStateAnimator.stepAnimationLocked:484 com.android.server.wm.WindowAnimator.updateWindowsLocked:303 com.android.server.wm.WindowAnimator.animateLocked:704 
07-19 17:38:33.116 3951-10165/system_process W/ActivityManager:   Force finishing activity com.mycompany.myapp/.MyAppPaid
07-19 17:38:33.120 3951-4076/system_process W/InputDispatcher: channel '4176eea com.mycompany.myapp/com.mycompany.myapp.MyAppPaid (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
07-19 17:38:33.121 3951-4076/system_process E/InputDispatcher: channel '4176eea com.mycompany.myapp/com.mycompany.myapp.MyAppPaid (server)' ~ Channel is unrecoverably broken and will be disposed!
07-19 17:38:33.137 3951-4245/system_process I/WindowManager: WIN DEATH: Window{4176eea u0 com.mycompany.myapp/com.mycompany.myapp.MyAppPaid}
07-19 17:38:33.137 3951-4245/system_process W/InputDispatcher: Attempted to unregister already unregistered input channel '4176eea com.mycompany.myapp/com.mycompany.myapp.MyAppPaid (server)'
07-19 17:38:33.137 3951-4245/system_process W/WindowManager: Force-removing child win Window{57133bc u0 SurfaceView - com.mycompany.myapp/com.mycompany.myapp.MyAppPaid} from container Window{4176eea u0 com.mycompany.myapp/com.mycompany.myapp.MyAppPaid}
07-19 17:38:33.137 3951-4245/system_process I/WindowManager: Destroying surface Surface(name=SurfaceView - com.mycompany.myapp/com.mycompany.myapp.MyAppPaid) called by com.android.server.wm.WindowStateAnimator.destroySurface:1992 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:885 com.android.server.wm.WindowState.removeLocked:1447 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2477 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2456 com.android.server.wm.WindowManagerService.removeWindowLocked:2435 com.android.server.wm.WindowState$DeathRecipient.binderDied:1772 android.os.BinderProxy.sendDeathNotice:688 
07-19 17:38:33.146 3951-4245/system_process I/WindowManager: Destroying surface Surface(name=com.mycompany.myapp/com.mycompany.myapp.MyAppPaid) called by com.android.server.wm.WindowStateAnimator.destroySurface:1992 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:885 com.android.server.wm.WindowState.removeLocked:1447 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2477 com.android.server.wm.WindowManagerService.removeWindowLocked:2435 com.android.server.wm.WindowState$DeathRecipient.binderDied:1772 android.os.BinderProxy.sendDeathNotice:688 <bottom of call stack> 
07-19 17:38:33.161 3951-4203/system_process I/ActivityManager: Process com.mycompany.myapp (pid 10103) has died
07-19 17:38:33.693 1246-1246/? E/Layer: [Application Error: com.mycompany.myapp] rejecting buffer: bufWidth=1777, bufHeight=1077, front.active.{w=225, h=225}
07-19 17:38:33.791 1246-1246/? E/Layer: [Application Error: com.mycompany.myapp] rejecting buffer: bufWidth=1664, bufHeight=1077, front.active.{w=225, h=225}

0 个答案:

没有答案
相关问题