Android.mk构建中.so文件缺失求助:ffmpeg-kit集成失败
问题分析与解决方案
问题背景
原本在Android Studio中集成ffmpeg-kit可正常运行的Java代码库,改用Android.mk编译时出现找不到.so文件的错误,且最终生成的APK中不存在对应ABI的lib目录,尝试将ffmpeg-kit作为独立模块构建也未解决该问题。
提供的配置文件
Android.mk
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libabidect LOCAL_SRC_FILES := src/jni/libffmpegkit_abidetect.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := ffmpegkit LOCAL_SRC_FILES := ffmpegkit.c LOCAL_LDLIBS := -llog LOCAL_SHARED_LIBRARIES := libabidect LOCAL_C_INCLUDES := ffmpegkit include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_SYSTEM_EXT_MODULE := true LOCAL_MODULE_OWNER := mtk LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := platform LOCAL_STATIC_ANDROID_LIBRARIES := \ android-support-constraint-layout \ android-support-v17-leanback \ android-support-design \ android-support-v4 \ LOCAL_STATIC_JAVA_AAR_LIBRARIES := \ lottie \ ffmpeg \ LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-constraint-layout-solver \ com.mediatek.support.factory \ aaa \ AudioAnalyzer \ javaee-api \ LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/res LOCAL_USE_AAPT2 := true LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := PACKAGE_NAME LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_DEX_PREOPT := false include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \ lottie:libs/lottie-2.7.0.aar \ AudioAnalyzer:libs/AudioAnalyzer.jar \ ffmpeg:libs/ ffmpeg-kit-full-gpl-6.0.aar \ javaee-api:libs/javaee-api-8.0.1.jar \ LOCAL_SHARED_LIBRARIES := libabidect include $(BUILD_MULTI_PREBUILT)
构建脚本
# Prepare some environment variables before build export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8 # Apply patch before build # bash vendor/mediatek/tv/build/android/android_r_base_build_fusion.sh source build/envsetup.sh m -j4 WEEKLY_BUILD_TYPE=PRETEST EMMC_SIZE=16G PACKAGE
问题根源
- AAR库中的SO未被正确提取打包:ffmpeg-kit的AAR包中包含对应ABI的SO文件,但当前配置仅将其作为静态Java库引用,未处理其中的原生库资源。
- 预构建SO的路径与ABI匹配问题:手动添加的
libffmpegkit_abidetect.so未按ABI目录结构放置,构建系统无法识别并打包到对应ABI目录。 - 模块依赖关联缺失:打包APK的模块未明确依赖原生SO模块,导致构建系统不会将SO文件打包进APK。
修复步骤
步骤1:正确处理ffmpeg-kit的AAR包
ffmpeg-kit的AAR包含原生SO,需明确提取其中的SO文件,修改Android.mk中预构建部分:
include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \ lottie:libs/lottie-2.7.0.aar \ AudioAnalyzer:libs/AudioAnalyzer.jar \ javaee-api:libs/javaee-api-8.0.1.jar \ # 单独提取ffmpeg-kit AAR中的SO,按需添加目标ABI LOCAL_PREBUILT_JNI_LIBS := \ libs/ffmpeg-kit-full-gpl-6.0.aar!/lib/armeabi-v7a/libffmpegkit.so \ libs/ffmpeg-kit-full-gpl-6.0.aar!/lib/armeabi-v7a/libffmpegkit_abidetect.so \ libs/ffmpeg-kit-full-gpl-6.0.aar!/lib/arm64-v8a/libffmpegkit.so \ libs/ffmpeg-kit-full-gpl-6.0.aar!/lib/arm64-v8a/libffmpegkit_abidetect.so include $(BUILD_MULTI_PREBUILT)
步骤2:确保APK模块依赖原生库
在打包APK的模块中添加对原生库的依赖,让构建系统自动打包SO:
include $(CLEAR_VARS) # ... 保留原有配置 ... # 添加原生库依赖 LOCAL_SHARED_LIBRARIES := libffmpegkit libabidect # 强制要求构建系统包含这些模块 LOCAL_REQUIRED_MODULES := libffmpegkit libabidect # 开启AAR原生库自动提取 LOCAL_AAPT_FLAGS += --auto-add-overlay --extract-native-libs
步骤3:规范手动引入SO的目录结构
如果保留手动引入的SO文件,需按Android构建要求的目录结构存放:
src/jni/ ├── armeabi-v7a/ │ └── libffmpegkit_abidetect.so ├── arm64-v8a/ │ └── libffmpegkit_abidetect.so └── ... 其他需要支持的ABI目录 ...
然后修改预构建SO的配置:
include $(CLEAR_VARS) LOCAL_MODULE := libabidect LOCAL_SRC_FILES := src/jni/$(TARGET_ARCH_ABI)/libffmpegkit_abidetect.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_CLASS := SHARED_LIBRARIES include $(PREBUILT_SHARED_LIBRARY)
步骤4:指定构建ABI(可选)
在构建脚本中添加目标ABI,确保构建对应架构的SO:
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8 export TARGET_ARCH_ABI=arm64-v8a source build/envsetup.sh m -j4 WEEKLY_BUILD_TYPE=PRETEST EMMC_SIZE=16G PACKAGE
验证方法
构建完成后,解压生成的APK文件,检查lib/目录下是否存在对应ABI的子目录,且包含libffmpegkit.so和libffmpegkit_abidetect.so文件。
内容的提问来源于stack exchange,提问作者Kenan Bandaliyev
相关产品推荐
相关产品推荐

