下面的都是错误的存在问题
编译安卓下面的x264巨坑
首先是Found no assembler 错误,
那么就百度方案两种;将 --disable-asm 添加到命令行,或者安装nasm。坑的开始,我想着还是安装上怕之后有东西不支持,所以就去下载高版本的NASM,然后解决了Found no assembler 问题
https://www.cnblogs.com/wanggang123/p/8660435.html 解决Found no assembler
https://blog.csdn.net/ByChen623/article/details/53616126 Ubuntu上安装NASM
然后巨坑来了 No working C compiler found 问题
首先百度方案是说ndk配置路径得到root路径并配置到环境变量,这一部分可以最后通过ndk-build验证是否配置成功,
但是还是一直报错
后来又找到https://www.itdaan.com/blog/2015/07/08/7ec37909141e3f276671374788380a2a.html X264移植android问题记录(No working C compiler found)
说加入 --disable-asm但是还是不行,一直提示错误。
因为尝试了很多个网上的configure配置,最后偶然的一次 我加入 --disable-asm的没有加\的连接符突然成功了,可以进行make有目标文件夹创建了,
建议先./configure 配置 网上很多直接一个脚本make makeinstall那么就会打印很多信息而没有看到错误,但是又没有目标文件夹的出现,一直有问题并且当前目录生成的libx264.a是linux的x264而不是用ndk编译出来的安卓版本的。
一些参考网上的实践参数
#!/bin/bash
ANDROID_NDK=/opt/ndk/android-ndk-r19c
SYSROOT=$ANDROID_NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-static \
--disable-gpac \
--disable-asm \
--disable-cli \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--host=arm-linux \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""
build_one
最后实践参数 两种安卓架构的一起生成
#!/bin/bash
ANDROID_NDK=/opt/ndk/android-ndk-r19c
ADDI_CFLAGS=""
configure()
{
CPU=$1
PREFIX=$(pwd)/android/$CPU
HOST=""
CROSS_PREFIX=""
SYSROOT=""
if [ "$CPU" == "armv7-a" ]
then
HOST=arm-linux
SYSROOT=$ANDROID_NDK/platforms/android-21/arch-arm/
CROSS_PREFIX=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
else
HOST=aarch64-linux
SYSROOT=$ANDROID_NDK/platforms/android-21/arch-arm64/
CROSS_PREFIX=$ANDROID_NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
fi
./configure \
--prefix=$PREFIX \
--enable-static \
--disable-gpac \
--disable-asm
--disable-cli \
--cross-prefix=$CROSS_PREFIX \
--host=$HOST \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
build()
{
make clean
cpu=$1
echo "build $cpu"
configure $cpu
#-j<CPU核心数>
make -j4
make install
}
build arm64
build armv7-a
整体参考链接:https://blog.csdn.net/bobcat_kay/article/details/88843778
上面的都是有问题的,交叉编译工具链都指定存在问题,因群友指教以及公众号的文章重新编译,已成功编出。脚本如下。自动修改相关路径
编译X264
#!/bin/bash
export NDK=/opt/ndk/android-ndk-r19c # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=21
function build_android
{
./configure \
--prefix=$PREFIX \
--disable-cli \
--disable-shared \
--enable-static \
--enable-pic \
--host=$my_host \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
make clean
make -j8
make install
}
#arm64-v8a
PREFIX=./android/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
build_android
#armeabi-v7a
PREFIX=./android/armeabi-v7a
my_host=armv7a-linux-android
export TARGET=armv7a-linux-androideabi
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
build_android
编译带x264的ffmpeg
#!/bin/bash
export NDK=/opt/ndk/android-ndk-r19c # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--disable-postproc \
--enable-static \
--enable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-nonfree \
--enable-muxers \
--enable-decoders \
--enable-demuxers \
--enable-parsers \
--enable-protocols \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$X264_INCLUDE" \
--extra-ldflags="-L$X264_LIB"
make clean
make -j8
make install
echo "The Compilation of FFmpeg with x264,fdk-aac for $CPU is completed"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
BASE_PATH=/home/aston/androidFFmpeg
LIB_TARGET_ABI=arm64-v8a
#指定 x264 的头文件和静态库目录
X264_INCLUDE=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/lib
build_android
cp $X264_LIB/libx264.a $PREFIX/lib
#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
BASE_PATH=/home/aston/androidFFmpeg
LIB_TARGET_ABI=armeabi-v7a
X264_INCLUDE=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/lib
build_android
cp $X264_LIB/libx264.a $PREFIX/lib
参考链接:
https://mp.weixin.qq.com/s/Gbqq7yYKGQxQpCk5WYI2_Q FFmpeg、x264以及fdk-aac 编译整合
https://mp.weixin.qq.com/s/5U6la1GdHf1I0E7Vaa7dIw FFmpeg 编译
https://blog.csdn.net/zhongjianblackberry/article/details/106897411 FFmpeg一键编译Android arm64位和32位共享库(armeabi-v7a arm64-v8a)
安卓集成ffmpeg静态库(Android.mk)方式
参考链接:
https://blog.csdn.net/Plx0303sunny/article/details/103494365 Android工程中使用FFMPEG静态库(CMake和Android mk) (注意在我这里实践的时候mk需要多链接一些库,不然调用ffmpeg函数的时候报错)
https://mp.weixin.qq.com/s/7pBjoVGDl_zGDwWWBOhkmg Android NDK 开发之 CMake 必知必会
(没有实践成功所以暂时采用mk的方式编译so来提供jni使用)
相关文件内容(注意建立native C++工程)
Android.mk
#Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avfilter
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := x264
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libx264.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := \
native-lib.cpp
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES := avfilter avformat avcodec avutil swresample swscale x264
LOCAL_CPPFLAGS:=-std=c++11
LOCAL_LDLIBS += -landroid -llog -lGLESv2 -lz -lOpenSLES
include $(BUILD_SHARED_LIBRARY)
Application.mk
#Application.mk
APP_ABI := armeabi-v7a
APP_STL := c++_static
FFmepgRecord .java
package com.example.androidffmepgrecord;
public class FFmepgRecord {
static {
System.loadLibrary("native-lib");
}
public static String GetFFmpegVersion() {
return stringFromJNI();
}
/**
* A native method that is implemented by the 'androidffmepgrecord' native library,
* which is packaged with this application.
*/
public static native String stringFromJNI();
}
build.gradle
补充一条ubuntu下ndk编译安卓so的问题
Ndk编译提示Input/output error错误
原因:在共享文件夹下编译会存在问题,复制到虚拟机本地就可以了。