[✔️]ffmpeg Android 打包

简介: [✔️]ffmpeg Android 打包

一个jni调用ffmpeg的demo


The LOCAL_SRC_FILES for a prebuilt library should only contain one item


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos_crypto_static
LOCAL_MODULE_FILENAME := crypto
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcrypto.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/android
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_MODULE := cocos_ssl_static
LOCAL_MODULE_FILENAME := ssl
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libssl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/android
include $(PREBUILT_STATIC_LIBRARY)


CPU架构


1、armeabi-v7a:  第7代及以上的 32位ARM 处理器


2、arm64-v8a: 第8代、64位ARM处理器


3、armeabi: 第5代、第6代的32位ARM处理器,早期的手机在使用,现在基本很少了。


4、x86:  Intel 32位处理器,在平板、模拟器用得比较多。


5、x86_64: Intel 64位处理器,在平板、模拟器用得比较多。


ABI 三元组
armeabi-v7a armv7a-linux-androideabi
arm64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android
NDK 操作系统变体 主机标记
macOS darwin-x86_64
Linux linux-x86_64
64 位 Windows windows-x86_64


AArch64是ARMv8的一种执行状态。


若要使用 API 级别 21 的 minSdkVersion 针对 64 位 ARM Android 进行编译,可使用以下两种方法,您可以选择其中最方便的一种:


$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    -target aarch64-linux-android21 foo.cpp


$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp


正确的写法是


#32bit  
ARCH=arm  
CPU=armv7-a  
#64bit  
ARCH=arm64  
CPU=armv8-a


 Error while executing process
F:\android-ndk-r15c\ndk-build.cmd with arguments 
{
  NDK_PROJECT_PATH=null 
  APP_BUILD_SCRIPT=E:\proj\tank5\client\frameworks\runtime-src\proj.android-studio\app\jni\Android.mk 
  NDK_APPLICATION_MK=E:\proj\tank5\client\frameworks\runtime-src\proj.android-studio\app\jni\Application.mk 
  APP_ABI=armeabi 
  NDK_ALL_ABIS=armeabi 
  NDK_DEBUG=0 
  APP_PLATFORM=android-14 
  NDK_OUT=E:/proj/tank5/client/frameworks/runtime-src/proj.android-studio/app/build/intermediates/ndkBuild/release/obj 
  NDK_LIBS_OUT=E:\proj\tank5\client\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\release\lib 
  NDK_TOOLCHAIN_VERSION=4.9 
  APP_PLATFORM=android-10 
  NDK_MODULE_PATH=
    E:/proj/tank5/client/frameworks/runtime-src/Classes;
    E:/proj/tank5/client/frameworks/cocos2d-x;
    E:/proj/tank5/client/frameworks/cocos2d-x/cocos;
    E:/proj/tank5/client/frameworks/cocos2d-x/external 
  NDK_DEBUG=0 clean
}
Android NDK: android-10 is unsupported. Using minimum supported version android-14.
Android NDK: WARNING: Ignoring unknown import directory: my_relative_path
Android NDK: ERROR:E:/proj/tank5/client/frameworks/cocos2d-x/external/ffmpeg/prebuilt/android/Android.mk:cocos_ffmpeg_libavcodec: LOCAL_SRC_FILES points to a missing file
Android NDK: Check that E:/proj/tank5/client/frameworks/cocos2d-x/external/ffmpeg/prebuilt/android/armeabi/libavcodec.a exists  or that its path is correct
F:/android-ndk-r15c/build//../build/core/prebuilt-library.mk:45: *** Android NDK: Aborting    .  Stop.


ninja: error:xxx, needed by xxx, missing and no known rule to make it


ninja: error: '/XXX/NDKApplication/app/src/main/cpp/src/main/cpp/armeabi-v7a/libavcodec.so',
needed by '/XXX/NDKApplication/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libhf_code.so', missing and no known rule to make it


检查IMPORTED_LOCATION,底层不会自动补全lib,所以必须是存在的值


set_target_properties(${lib} PROPERTIES
        IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/lib${lib}.so
        #                                            ↑ 底层不会补全这个lib  
)


ndk build android.mk添加外部so


  • jni/Android.mk


LOCAL_SHARED_LIBRARIES += cocos_ffmpeg_libavformat
# ...
$(call import-add-path,$(LOCAL_PATH)) # 模块查找路径
$(call import-module,ffmpeg/)


  • ffmpeg/Android.mk


include $(CLEAR_VARS)
LOCAL_MODULE := cocos_ffmpeg_libavformat
LOCAL_MODULE_FILENAME := libavformat                 # 注意这个名字,要和下边的对应
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libavformat.so # 注意这个名字,要和上边的对应
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include
include $(PREBUILT_SHARED_LIBRARY)


最终apk包里面会有这个文件: apk/lib/arm64-v8a/libavformat.so


Execution failed for task: externalNativeBuildDebug FAILED


有可能是编译so的ndk版本高于了项目使用的ndk版本


project ndk version >= so ndk version


ndk Unexpected native build target Valid values are:


so库有问题


externalNativeBuild {
    ndkBuild {
        if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODE.compareTo('none') != 0) {
            // skip the NDK Build step if PROP_NDK_MODE is none
            targets 'cocos2dlua'
            arguments 'NDK_TOOLCHAIN_VERSION=4.9'
            arguments 'APP_PLATFORM=android-' + PROP_APP_PLATFORM
            def module_paths = [project.file("../../Classes").absolutePath,
                                project.file("../../../cocos2d-x").absolutePath,
                                project.file("../../../cocos2d-x/cocos").absolutePath,
                                project.file("../../../cocos2d-x/external").absolutePath]
            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                // should use '/'
                module_paths = module_paths.collect { it.replaceAll('\\', '/') }
                arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
            } else {
                arguments 'NDK_MODULE_PATH=' + module_paths.join(':')
            }
            arguments '-j' + Runtime.runtime.availableProcessors()
            abiFilters.addAll(PROP_APP_ABI.split(':').collect { it as String })
        }
    }
}


  • gradlew.properties


PROP_APP_ABI=armeabi:armeabi-v7a:arm64-v8a


如果PROP_APP_ABI缺失arm64-v8a就会被过滤掉,build.gradle里面abiFilter就是写了arm64-v8a也没用,项目配置的一个大坑!

目录
相关文章
|
8月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
292 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
8月前
|
敏捷开发 Java 机器人
云效产品使用常见问题之打包后的Android应用获取下载地址失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
8月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
370 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
6天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
7月前
|
安全 Java Android开发
05. 【Android教程】Android 程序签名打包
05. 【Android教程】Android 程序签名打包
76 1
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
119 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
5月前
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
391 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
8月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
139 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
6月前
|
Android开发
【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk
【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk
162 0
|
7月前
|
Java 开发工具 Android开发
详细解读Android开发DNK开发将.c文件打包成os
详细解读Android开发DNK开发将.c文件打包成os
36 0