Flutter VLC Player返回页面后应用崩溃问题求助
问题现象
集成Flutter VLC Player后,从播放页面返回时应用直接崩溃,使用pub.dev官方示例代码测试仍出现相同问题,报错信息如下:
D/apitrace(22547): apitrace: warning: caught signal 6
D/apitrace(22547): call flush from exceptionCallback
F/libc (22547): Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 23200
(AWindowHandler), pid 22547 (.webyte.vidflix)Build fingerprint: 'OPPO/CPH2015/OP4C7D:9/PPR1.180610.011/1640680627:user/release-keys'
Revision: '0'
ABI: 'arm64'
pid: 22547, tid: 23200, name: AWindowHandler >>> com.webyte.vidflix <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: JNI GetJavaVM called with pending exception java.lang.RuntimeException: Error during detachFromGLContext (see logcat for details)'
当前使用的核心代码:
@override void initState() { super.initState(); _videoPlayerController = VlcPlayerController.network( 'https://media.w3.org/2010/05/sintel/trailer.mp4', hwAcc: HwAcc.full, autoPlay: true, options: VlcPlayerOptions(), )..initialize(); } @override void dispose() async { super.dispose(); await _videoPlayerController!.stopRendererScanning(); await _videoPlayerController!.dispose(); }
解决方法
- 调整dispose执行顺序:将
super.dispose()移到控制器资源释放之后,避免父组件释放后VLC控制器的JNI调用失去上下文:@override void dispose() async { await _videoPlayerController!.stopRendererScanning(); await _videoPlayerController!.dispose(); super.dispose(); } - 降低硬件加速级别:部分设备对
HwAcc.full支持不佳,改为HwAcc.auto或HwAcc.disable尝试:_videoPlayerController = VlcPlayerController.network( 'https://media.w3.org/2010/05/sintel/trailer.mp4', hwAcc: HwAcc.auto, autoPlay: true, options: VlcPlayerOptions(), )..initialize(); - 添加状态校验:在释放前检查控制器是否已初始化,避免无效状态下的JNI调用:
@override void dispose() async { if (_videoPlayerController != null && _videoPlayerController!.value.isInitialized) { await _videoPlayerController!.stopRendererScanning(); await _videoPlayerController!.dispose(); } super.dispose(); }
内容的提问来源于stack exchange,提问作者Sheikh Rohan

