не удается найти нативные символы API камеры и NDK при связывании libavdevice.a с libffmpeg.so - PullRequest
0 голосов
/ 03 сентября 2018

Я использую инструменты NDK для создания общей библиотеки ffmpeg, которая будет использоваться в моем Android RTSP проекта. Все необходимые компоненты скомпилированы / связаны как отдельные статические библиотеки, и, наконец, эти библиотеки будут связаны как одна общая библиотека.
Все идет хорошо, кроме последнего шага. ошибка происходит при связывании libavdevice, все символы в камере NDK и медиа не могут быть найдены, ошибка войти:

libavdevice/android_camera.c:702: error: undefined reference    
to 'ACameraCaptureSession_stopRepeating'
libavdevice/android_camera.c:706: error: undefined reference 
to 'ACameraCaptureSession_close'
libavdevice/android_camera.c:711: error: undefined reference 
to 'ACaptureRequest_removeTarget'
libavdevice/android_camera.c:712: error: undefined reference
to 'ACaptureRequest_free'
libavdevice/android_camera.c:717: error: undefined reference 
to 'ACameraOutputTarget_free'
libavdevice/android_camera.c:722: error: undefined reference 
to 'ACaptureSessionOutputContainer_remove'
libavdevice/android_camera.c:724: error: undefined reference 
to 'ACaptureSessionOutput_free'
libavdevice/android_camera.c:729: error: undefined reference 
to 'ANativeWindow_release'
libavdevice/android_camera.c:734: error: undefined reference 
to 'ACaptureSessionOutputContainer_free'
libavdevice/android_camera.c:739: error: undefined reference 
to 'ACameraDevice_close'
libavdevice/android_camera.c:744: error: undefined reference 
to 'AImageReader_delete'
libavdevice/android_camera.c:749: error: undefined reference 
to 'ACameraMetadata_free'
libavdevice/android_camera.c:756: error: undefined reference
to 'ACameraManager_delete'
libavdevice/android_camera.c:172: error: undefined reference
to 'ACameraDevice_getId'
libavdevice/android_camera.c:163: error: undefined reference
to 'ACameraDevice_getId'
libavdevice/android_camera.c:392: error: undefined reference
to 'AImageReader_acquireLatestImage'
libavdevice/android_camera.c:483: error: undefined reference  
to 'AImage_delete'
libavdevice/android_camera.c:345: error: undefined reference
to 'AImage_getPlanePixelStride'
libavdevice/android_camera.c:346: error: undefined reference
to 'AImage_getPlaneData'
...

Вот мой скрипт сборки, который запускается на моем компьютере с Windows 7 x86_64.

#!/bin/bash
export TMPDIR=D:/other/AndroidDevelopment/ffmpeg-4.0.2/ffmpegtemp 
NDK=D:/software/app/android_sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-28/arch-x86_64/
TOOLCHAIN=$NDK/toolchains/x86_64-4.9/prebuilt/windows-x86_64
CPU=x86_64
PREFIX=./android/$CPU

function build_one
{
    ./configure \
    --prefix=$PREFIX \
    --enable-static \
    --enable-jni \
    --enable-pthreads \
    --enable-mediacodec \
    --disable-asm \
    --disable-shared \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/x86_64-linux-android- \
    --target-os=android \
    --arch=x86_64 \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags=" -isysroot $NDK/sysroot  -I$NDK/sysroot/usr/include/x86_64-linux-android" \
    --extra-ldflags=-pie 
make clean
make -j4
make install

$TOOLCHAIN/bin/x86_64-linux-android-ld \
-rpath-link=$SYSROOT/usr/lib64 \
-L$SYSROOT/usr/lib64 \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no- undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/x86_64-linux-android/4.9.x/libgcc.a \
}
build_one

1 Ответ

0 голосов
/ 04 сентября 2018

Ваша команда …-ld нуждается в явных ссылках на собственные библиотеки Android:

-lcamera2ndk -lmediandk -lnativewindow

На самом деле, я не понимаю этой одержимости функцией оболочки build_one. Вот минимальный скрипт, который работает для меня, с NDK r18b2 и ffmpeg 4.0.2:

export NDK=whatever
export CPU=x86_64
export CROSS=$NDK/toolchains/$CPU-4.9/prebuilt/darwin-x86_64/bin/$CPU-linux-android-
mkdir android_$CPU
cd android_$CPU
../configure --enable-static --enable-jni --enable-pthreads --enable-mediacodec \
  --disable-asm --disable-shared --disable-doc --disable-ffmpeg --disable-ffplay \
  --disable-ffprobe --disable-doc --disable-symver \
  --cross-prefix=$CROSS --target-os=android --arch=$CPU --enable-cross-compile \
  --sysroot=$NDK/platforms/android-28/arch-$CPU \
  --extra-cflags="-isysroot $NDK/sysroot -I $NDK/sysroot/usr/include -I $NDK/sysroot/usr/include/$CPU-linux-android" \
  --extra-ldflags="-pie -L$NDK/platforms/android-28/arch-$CPU/usr/lib64 -lc -lm" \
  --ld=$CROSS-ld
make CONFIG_V4L2_OUTDEV=no
$CROSS-ld -soname libffmpeg.so -shared -nostdlib -Bsymbolic \
  --whole-archive --no-undefined -o libffmpeg.so \
  libavcodec/libavcodec.a libavfilter/libavfilter.a \
  libswresample/libswresample.a libavformat/libavformat.a \
  libavutil/libavutil.a libswscale/libswscale.a  libavdevice/libavdevice.a \
  -L$NDK/platforms/android-28/arch-$CPU/usr/lib64 \
  -lc -lm -lz -lcamera2ndk -lmediandk -lnativewindow

Обратите внимание, что я отключил v4l2 output . Моя компиляция не удалась для libavdevice / v4l2.c , поскольку определение NDK ioctl () не было совместимо с ffmpeg .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...