无法将FFmpeg C库移植到android



我到底想做什么:访问ffmpeg.c文件修改int main(int argc, char **argv)函数到JNI并将ffmpeg命令作为字符串传递。

我已经尝试将ffmpeg C库移植到android(ARM处理器)。我遵循了以下不同的方法来做到这一点。

第一次尝试:使用官方的ffmpeg安装文档。步骤如下

a) git clone git://source.ffmpeg.org/ffmpeg.git ffmpegb)读取INSTALL文件。

c)下载x264库并使用构建成功的build_x264.sh进行构建。
    NDK=/home/nav/Work/android/ndk
    PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt
    PLATFORM=$NDK/platforms/android-8/arch-arm
    PREFIX=/home/nav/28ffmpeg/android-ffmpeg                
    ./configure --prefix=$PREFIX --enable-static --enable-pic --disable-asm --disable-cli --host=arm-linux --cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- --sysroot=$PLATFORM
  make
  sudo make install
  sudo ldconfig
d)然后我下载ffmpeg库从(http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2)使用build_android.sh 构建它
#!/bin/bash
NDK=/home/nav/Work/android/ndk
PLATFORM=$NDK/platforms/android-8/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PREFIX=/home/nav/28ffmpeg/android-ffmpeg
function build_one
                {
                ./configure --target-os=linux --prefix=$PREFIX 
                --enable-cross-compile 
                --enable-runtime-cpudetect 
                --disable-asm 
                --arch=arm 
                --cc=$PREBUILT/bin/arm-linux-androideabi-gcc 
                --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- 
                --disable-stripping 
                --nm=$PREBUILT/bin/arm-linux-androideabi-nm 
                --sysroot=$PLATFORM 
                --enable-nonfree 
                --enable-version3 
                --disable-everything 
                --enable-gpl 
                --disable-doc 
                --enable-avresample 
                --enable-demuxer=rtsp 
                --enable-muxer=rtsp 
                --disable-ffplay 
                --disable-ffserver 
                --enable-ffmpeg 
                --disable-ffprobe 
                --enable-libx264 
                --enable-encoder=libx264 
                --enable-decoder=h264 
                --enable-protocol=rtp 
                --enable-hwaccels 
                --enable-zlib 
                --disable-devices 
                --disable-avdevice 
--extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" 
                --extra-ldflags="-L/home/android-ffmpeg/lib"
                make -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
                }
                build_one

e)最初它工作得很好。但是在错误之后出现:

libavformat/libavformat.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'
libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here
libavutil/libavutil.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'
libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here
build_android.sh: 48: build_one: not found
结果:

libffmpeg。so未找到

第二次尝试:然后我按照步骤http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html->构建

a)我下载了Pre-Build libffmpeg。所以从上面的链接。

b)添加libffmpeg。so to libs/armeabi/ .

c)使Android。可

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_STATIC_LIBRARIES += ffmpeg
LOCAL_SRC_FILES := ffmpeg-test.c
include $(BUILD_SHARED_LIBRARY)

d)然后我做所有的ndk设置和所有。将ffmpeg.c从库复制到ffmpeg-test.c,将其int main函数更改为my JNI函数,并包含所有必要的include文件。

错误:

控制台:

  /home/nav/Work/android/ndk/ndk-build all 
Prebuilt       : libffmpeg.so <= jni/
Install        : libffmpeg.so => libs/armeabi/libffmpeg.so
Compile thumb  : main <= ffmpeg-test.c
jni/ffmpeg-test.c: In function 'print_report':
jni/ffmpeg-test.c:1139:94: warning: incompatible implicit declaration of built-in function 'log2' [enabled by default]
SharedLibrary  : libmain.so
/home/nav/Work/android/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/main/ffmpeg-test.o: in function check_keyboard_interaction:jni/ffmpeg-test.c:2496: error: undefined reference to 'qp_hist'

https://github.com/guardianproject/android-ffmpeg

查看git上的这个项目,了解如何修改'ffmpeg.c.main()'我相信这个项目的构建将在自述文件中提到的NDK发布时运行良好。

注意:

你应该花点时间学习NDK发行版中的所有doc文件,这样你才能理解make是如何工作的。

对于android JNI, 'main()'函数的退出条件通常需要稍微改变一下。

要修复多个定义,请添加:

$PREBUILT/bin/arm-linux-androideabi-ar -dv libavcodec.a log2_tab.o
$PREBUILT/bin/arm-linux-androideabi-ar -dv libavutil.a log2_tab.o

但是你可能还想添加这个配置选项:

--disable-symver

这样,我设法用ndk v8编译ffmpeg的HEAD版本,但使用LGPL许可证,其中包含的功能更少。

要解决多重定义问题,需要删除重复的*。这样冲突就不会发生。我能够使用以下命令实现相同的功能。

rm/libavcodec/log2_tab.o

rm/ffmpeg-3.0.1/libavcodec/reverse.o

相关内容

  • 没有找到相关文章

最新更新