You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库的导入

我怀疑的可能问题点

  1. FFmpegModule初始化问题:是不是模块中FFmpegKit的调用逻辑存在错误,导致应用启动时加载模块就崩溃?
  2. So库缺失/加载失败:FFmpegKit依赖对应的so库,手动集成.aar是否需要额外将so库放到jniLibs目录?
  3. ABI架构不兼容:Windows上构建的APK,是否与FFmpegKit .aar支持的CPU架构不匹配?
  4. 权限初始化问题:FFmpegKit是否需要特定权限,未配置导致启动崩溃?

有没有大佬遇到过类似的问题?或者能告诉我怎么排查这种无提示的启动崩溃?比如怎么查看Android原生层的错误日志?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:09:50