android studio configure build报错_android-ndk-r19c 编译FFMpeg4.1

转载请注明:android-ndk-r19c 编译FFMpeg4.1

最近开发得项目中需要用到FF,就去下载最新的代码,我用的是4.1

remotes/origin/release/4.1

下载之后又去下载了最新的NDK:android-ndk-r19c

开始编译后问题不少,网上搜索的编译脚本大部分都是基于GCC编译的,但是最新的NDK中GCC已去掉,只能使用clang来编译。

如下是编译脚本

#!/bin/bash

##第一类问题:

遇到的很多路径找不到的问题,比如clang找不到,

CC_name=28-clang

CXX_name=28-clang++

这两个变量就是为了配置clang的路径设置的。

##第二类问题:

CC	libavdevice/v4l2.o
libavdevice/v4l2.c:135:9: error: assigning to 'int (*)(int, unsigned long, ...)' from incompatible type '<overloaded function type>'
        SET_WRAPPERS();
        ^~~~~~~~~~~~~~
libavdevice/v4l2.c:121:17: note: expanded from macro 'SET_WRAPPERS'
    s->ioctl_f  = prefix ## ioctl;      
                ^           ~~~~~
/home/cc/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/bits/ioctl.h:56:5: note: candidate function has type mismatch at 2nd parameter
      (expected 'unsigned long' but has 'unsigned int')
int ioctl(int __fd, unsigned __request, ...) __overloadable __enable_if(1, "") __RENAME(ioctl);
    ^
/home/cc/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/bits/ioctl.h:36:5: note: candidate function has type mismatch at 2nd parameter
      (expected 'unsigned long' but has 'int')
int ioctl(int __fd, int __request, ...);
    ^
1 error generated.
make: *** [ffbuild/common.mak:60: libavdevice/v4l2.o] Error 1

该错误表示函数指针类型不正确。

man一下系统的ioctl函数,跟报错的指针类型是一致的,说明这里没有引用标准的ioctl.h

c7cdfe503afcd84d3a1ab7ea438f1952.png

后来查到NDK中该函数的定义

toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/ioctl.h

3c9ee48b5f42b58dd1c6420a935f1b1c.png

解决办法就是在编译脚本中添加了宏:BIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD

#################2020-08-13更新###################

遇到了几个问题,

1. 需要编译不同的架构版本,添加了两个参数arm和arm64,

用法:./build.sh arm64

如果不带参数,会编译arm64。

2. 在低版本android机器上运行,会提示库或者方法找不到,如下:

 java.lang.UnsatisfiedLinkError: dlopen failed: library "libcamera2ndk.so" not found
        at java.lang.Runtime.loadLibrary(Runtime.java:372)
        at java.lang.System.loadLibrary(System.java:1076)

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "iconv_close" referenced by "/data/app/com.udx.player.default-fNOzMQQ2UEz-wXtlcReA3Q==/lib/arm64/libavcodec.so"...
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "fgets_unlocked" referenced by "/data/app/com.udx.player.default-oaYAVLjyHVdCkqyxaK0fDw==/lib/arm64/libavfilter.so"...
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)

我在android 6.0上运行,就会出现如上问题,因为我依赖的NDK版本比较高,所以将NDK高版本中的一些安卓库给编译进去了,解决方式就是使用低版本的clang

ANDROID_API=21
CC_name=$ANDROID_API-clang
CXX_name=$ANDROID_API-clang++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值