React Native 0.79(Kotlin)手动集成FFmpegKit .aar启动崩溃问题求助
React Native 0.79(Kotlin)手动集成FFmpegKit .aar启动崩溃问题求助
我最近在Windows环境下基于React Native 0.79(启用Kotlin支持)开发应用,打算手动通过.aar文件集成FFmpegKit(没有使用官方提供的ffmpeg-kit-react-native库)。目前项目构建完全成功,但应用安装后一启动就直接崩溃,连错误提示都看不到,实在卡在这里了,求大家帮忙看看😭
环境与配置概述
- React Native版本:0.79
- FFmpegKit .aar包:
ffmpeg-kit-full-6.0-2.aar - aar包放置路径:
android/app/libs - 项目启用Kotlin语言支持
- 自定义了两个原生模块文件:
FFmpegModule.kt、FFmpegPackage.kt(注:之前粘贴代码时出现路径混淆,下面会明确说明)
核心代码片段
1. MainApplication.kt(路径:android/app/src/main/java/com/veditor/MainApplication.kt)
之前误将该文件内容贴到了FFmpegModule.kt中,现在修正路径:
package com.veditor import android.app.Application import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.soloader.SoLoader class MainApplication : Application(), ReactApplication { private val mReactNativeHost: ReactNativeHost = object : DefaultReactNativeHost(this) { override fun getPackages(): List<ReactPackage> { return PackageList(this).packages + FFmpegPackage() } override fun getJSMainModuleName(): String { return "index" } override fun isNewArchEnabled(): Boolean { return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED } override fun isHermesEnabled(): Boolean { return BuildConfig.IS_HERMES_ENABLED } } override fun getReactNativeHost(): ReactNativeHost = mReactNativeHost override fun onCreate() { super.onCreate() if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { DefaultNewArchitectureEntryPoint.load() } ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager) SoLoader.init(this, false) } }
2. FFmpegPackage.kt(路径:android/app/src/main/java/com/veditor/FFmpegPackage.kt)
package com.veditor import com.facebook.react.ReactPackage import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager class FFmpegPackage : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> { return listOf(FFmpegModule(reactContext)) } override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> { return emptyList() } }
3. FFmpegModule.kt(待完善实现,路径:android/app/src/main/java/com/veditor/FFmpegModule.kt)
目前仅完成基础结构,尚未完全封装FFmpegKit方法:
package com.veditor import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.arthenica.ffmpegkit.FFmpegKit import com.facebook.react.bridge.Promise class FFmpegModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { override fun getName(): String { return "FFmpegModule" } @ReactMethod fun executeCommand(command: String, promise: Promise) { try { val session = FFmpegKit.execute(command) val returnCode = session.returnCode if (returnCode.isSuccess) { val logMessages = session.allLogs.joinToString("\n") { it.message } promise.resolve(logMessages) } else { promise.reject("FFMPEG_FAILED", "Command failed with code: ${returnCode.value}") } } catch (e: Exception) { promise.reject("FFMPEG_EXCEPTION", e.message) } } }
4. Android Build配置(android/app/build.gradle)
repositories { flatDir { dirs 'libs' } } dependencies { implementation(name: 'ffmpeg-kit-full-6.0-2', ext: 'aar') }
5. 测试页面代码
已修正官方库导入,改用自定义原生模块:
import React, { useState } from 'react'; import { View, Text, StyleSheet, Button, ScrollView, ActivityIndicator, NativeModules } from 'react-native'; const { FFmpegModule } = NativeModules; const FFmpegTestScreen = () => { const [output, setOutput] = useState<string>(''); const [loading, setLoading] = useState(false); const runFFmpegCommand = async () => { setLoading(true); setOutput(''); try { const result = await FFmpegModule.executeCommand('-version'); setOutput(`✅ Success:\n${result}`); } catch (error: any) { setOutput(`❌ Error:\n${error.message || JSON.stringify(error)}`); console.error('FFmpeg error:', error); } finally { setLoading(false); } }; return ( <View style={styles.container}> <Text style={styles.title}>🎥 FFmpegKit Test</Text> <Button title="Run FFmpeg (-version)" onPress={runFFmpegCommand} /> {loading && <ActivityIndicator style={{ marginTop: 20 }} />} <ScrollView style={styles.outputBox}> <Text style={styles.outputText}>{output}</Text> </ScrollView> </View> ); }; export default FFmpegTestScreen; const styles = StyleSheet.create({ container: { flex: 1, padding: 20, paddingTop: 40, backgroundColor: '#f2f2f2', }, title: { fontSize: 18, fontWeight: 'bold', marginBottom: 20, }, outputBox: { marginTop: 20, backgroundColor: '#fff', padding: 15, borderRadius: 8, maxHeight: 300, }, outputText: { fontSize: 14, color: '#333', }, });
崩溃表现
项目构建、安装都很顺利,点击应用图标后能看到启动页闪一下,但瞬间就崩溃了,完全没有任何可视化的错误提示,连红屏都看不到。
我已经尝试的操作
- 确认自定义原生模块的文件路径正确,都放在
android/app/src/main/java/com/veditor目录下 - 检查过
.aar包的完整性,解压后能看到正常的文件结构 - 移除了测试页面中对官方
ffmpeg-kit-react-native库的导入
我怀疑的可能问题点
- FFmpegModule初始化问题:是不是模块中FFmpegKit的调用逻辑存在错误,导致应用启动时加载模块就崩溃?
- So库缺失/加载失败:FFmpegKit依赖对应的so库,手动集成
.aar是否需要额外将so库放到jniLibs目录? - ABI架构不兼容:Windows上构建的APK,是否与FFmpegKit .aar支持的CPU架构不匹配?
- 权限初始化问题:FFmpegKit是否需要特定权限,未配置导致启动崩溃?
有没有大佬遇到过类似的问题?或者能告诉我怎么排查这种无提示的启动崩溃?比如怎么查看Android原生层的错误日志?
内容来源于stack exchange
相关产品推荐
相关产品推荐

