SceneView / sceneview-android

SceneView is a 3D and AR Android Composable and View with Google Filament and ARCore. This is a Sceneform replacement in Kotlin
Apache License 2.0
758 stars 151 forks source link

Crash on destroying the ArSceneView #450

Closed ArnaudMassonGC closed 1 month ago

ArnaudMassonGC commented 3 months ago

When I destroy ArSceneView manually OR when the ArSceneView is destroy automatically (when the fragment and/or activity with the ArSceneView is destroyed) the app crash with a nullpoint exception on the camera:

FATAL EXCEPTION: main
    Process: *************, PID: 21557
    java.lang.NullPointerException
    at io.github.sceneview.components.CameraComponent$DefaultImpls.getCamera(CameraComponent.kt:30)
    at io.github.sceneview.node.CameraNode.getCamera(CameraNode.kt:27)
    at io.github.sceneview.node.CameraNode.destroy(CameraNode.kt:330)
    at io.github.sceneview.ar.ARSceneView.destroy(ARSceneView.kt:581)

Version used 2.1.0

I've to go back to 2.0.4 and the crash doesn't happen.

krunal-simform commented 3 months ago

I'm experiencing the same crash when I press back or implement BackHandler to navigate to a different screen.

java.lang.NullPointerException
    at io.github.sceneview.components.CameraComponent$DefaultImpls.getCamera(CameraComponent.kt:30)
    at io.github.sceneview.node.CameraNode.getCamera(CameraNode.kt:27)
    at io.github.sceneview.node.CameraNode.destroy(CameraNode.kt:330)
    at io.github.sceneview.ar.ARSceneKt$rememberARCameraNode$$inlined$rememberNode$1$1.dispose(Effects.kt:498)
    at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:87)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1276)
    at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
    at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
    at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:639)
    at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
    at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
    at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
    at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
    at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
    at android.view.Choreographer.doCallbacks(Choreographer.java:899)
    at android.view.Choreographer.doFrame(Choreographer.java:827)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
    at android.os.Handler.handleCallback(Handler.java:942)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7872)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal .os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:936)

Version: 2.1.0

Jessewb786 commented 3 months ago

I'm actually experiencing the exact same issue on 2.1.0.

java.lang.NullPointerException
    at io.github.sceneview.components.CameraComponent$DefaultImpls.getCamera(CameraComponent.kt:30)
    at io.github.sceneview.node.CameraNode.getCamera(CameraNode.kt:27)
    at io.github.sceneview.node.CameraNode.destroy(CameraNode.kt:330)
    at io.github.sceneview.ar.ARSceneKt$rememberARCameraNode$$inlined$rememberNode$1$1.dispose(Effects.kt:498)
    at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:87)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1276)
    at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
    at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
    at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:639)
    at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
    at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
    at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
    at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
    at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
    at android.view.Choreographer.doCallbacks(Choreographer.java:899)
    at android.view.Choreographer.doFrame(Choreographer.java:827)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
    at android.os.Handler.handleCallback(Handler.java:942)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7872)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal .os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:936)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@9f66ca9, androidx.compose.ui.platform.MotionDurationScaleImpl@6bdf22e, StandaloneCoroutine{Cancelling}@c3e51cf, AndroidUiDispatcher@890175c]
krunal-simform commented 3 months ago

Getting a similar crash on the orientation change (and probably on any other configuration change).

java.lang.RuntimeException: Unable to destroy activity {<package>/<package>.ui.MainActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5971)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:6009)
    at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:6309)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:6206)
    at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:76)
    at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:144)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:101)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2630)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:257)
    at android.os.Looper.loop(Looper.java:368)
    at android.app.ActivityThread.main(ActivityThread.java:8826)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)

Caused by: java.lang.NullPointerException
    at io.github.sceneview.components.CameraComponent$DefaultImpls.getCamera(CameraComponent.kt:30)
    at io.github.sceneview.node.CameraNode.getCamera(CameraNode.kt:27)
    at io.github.sceneview.node.CameraNode.destroy(CameraNode.kt:330)
    at io.github.sceneview.ar.ARSceneKt$rememberARCameraNode$$inlined$rememberNode$1$1.dispose(Effects.kt:498)
    at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:87)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1276)
    at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:769)
    at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.disposeCurrentNodes(SubcomposeLayout.kt:593)
    at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.onRelease(SubcomposeLayout.kt:407)
    at androidx.compose.ui.node.LayoutNode.onRelease(LayoutNode.kt:1362)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1281)
    at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:769)
    at androidx.compose.ui.platform.WrappedComposition.dispose(Wrapper.android.kt:153)
    at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:161)
    at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:322)
    at androidx.lifecycle.LifecycleRegistry.backwardPass(LifecycleRegistry.kt:273)
    at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.kt:290)
    at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.kt:143)
    at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.kt:126)
    at androidx.lifecycle.ReportFragment$Companion.dispatch$lifecycle_runtime_release(ReportFragment.kt:190)
    at androidx.lifecycle.ReportFragment$LifecycleCallbacks.onActivityPreDestroyed(ReportFragment.kt:146)
    at android.app.Activity.dispatchActivityPreDestroyed(Activity.java:1612)
    at android.app.Activity.performDestroy(Activity.java:9044)
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1510)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5958)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:6009)
    at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:6309)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:6206)
    at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:76)
    at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:144)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:101)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2630)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:257)
    at android.os.Looper.loop(Looper.java:368)
    at android.app.ActivityThread.main(ActivityThread.java:8826)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
andytriboletti commented 2 months ago

I'm seeing the same thing when using tabs and clicking away from a sceneview. With Version 2.0.4 I get SIGSEGV:

2024-04-11 21:58:01.881 11165-11165 libc com.greenrobot.openspace A Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x2a8 in tid 11165 (robot.openspace), pid 11165 (robot.openspace)

andytriboletti commented 2 months ago

With the latest version I got it to work.

I am doing this: val cameraNode = SceneView.DefaultCameraNode(engine) then passing cameraNode to my scene.


 Scene(
            modifier = Modifier.fillMaxSize(),
            engine = engine,
            modelLoader = modelLoader,
            isOpaque = false,
            cameraNode = cameraNode,
            activity = LocalContext.current as? ComponentActivity,
            lifecycle = LocalLifecycleOwner.current.lifecycle,
            view = rememberView(engine),
            childNodes = rememberNodes {
                add(ModelNode(modelLoader.createModelInstance("apple.glb")).apply {
                    // Position the first apple
                    position = Position(0f, 0f, 0f)
                })
                add(ModelNode(modelLoader.createModelInstance("apple2.glb")).apply {
                    // Position the second apple
                    position = Position(2f, 0f, 0f)
                })
            },
            //environment = environmentLoader.createHDREnvironment("environment.hdr")!!
        )
afpatmin commented 2 months ago

A fork that have mitigated this here: https://github.com/ArgyleConcepts/sceneview-android/commit/02f8a53afb3b0342d9a3aa47fc2f6966a410280b

jacobmattsson commented 2 months ago

Same thing happens with the View-based API (with 2.1.1). On 2.0.4, this Exception doesn't occur.

java.lang.NullPointerException
    at io.github.sceneview.components.CameraComponent$DefaultImpls.getCamera(CameraComponent.kt:30)
    at io.github.sceneview.node.CameraNode.getCamera(CameraNode.kt:27)
    at io.github.sceneview.node.CameraNode.destroy(CameraNode.kt:330)
    at io.github.sceneview.SceneView.destroy(SceneView.kt:612)
    at io.github.sceneview.SceneView.onDetachedFromWindow(SceneView.kt:677)
    at android.view.View.dispatchDetachedFromWindow(View.java:22319)
    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3986)
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:5610)
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:5581)
    at android.view.ViewGroup.removeView(ViewGroup.java:5512)
    at androidx.fragment.app.FragmentContainerView.removeView(FragmentContainerView.kt:293)
    at androidx.fragment.app.SpecialEffectsController$Operation$State.applyState(SpecialEffectsController.kt:398)
    at androidx.fragment.app.DefaultSpecialEffectsController.applyContainerChanges(DefaultSpecialEffectsController.kt:757)
    at androidx.fragment.app.DefaultSpecialEffectsController.executeOperations$lambda$2(DefaultSpecialEffectsController.kt:90)
    at androidx.fragment.app.DefaultSpecialEffectsController.$r8$lambda$1QpWHhDUzj8NqxMUz0S9KkFt5ZY(Unknown Source:0)
    at androidx.fragment.app.DefaultSpecialEffectsController$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0)
    at androidx.fragment.app.SpecialEffectsController$Operation.complete(SpecialEffectsController.kt:608)
    at androidx.fragment.app.SpecialEffectsController$FragmentStateManagerOperation.complete(SpecialEffectsController.kt:663)
    at androidx.fragment.app.SpecialEffectsController$Operation.completeSpecialEffect(SpecialEffectsController.kt:587)
    at androidx.fragment.app.DefaultSpecialEffectsController$SpecialEffectsInfo.completeSpecialEffect(DefaultSpecialEffectsController.kt:774)
    at androidx.fragment.app.DefaultSpecialEffectsController.startAnimations(DefaultSpecialEffectsController.kt:150)
    at androidx.fragment.app.DefaultSpecialEffectsController.executeOperations(DefaultSpecialEffectsController.kt:101)
    at androidx.fragment.app.SpecialEffectsController.executePendingOperations(SpecialEffectsController.kt:234)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1956)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1845)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1782)
    at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:565)
    at android.os.Handler.handleCallback(Handler.java:959)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loopOnce(Looper.java:232)
    at android.os.Looper.loop(Looper.java:317)
    at android.app.ActivityThread.main(ActivityThread.java:8501)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
ThomasGorisse commented 1 month ago

Duplicate: #475 Fixed in 2.2.0