64位 CentOS NDK 编译 FFMPEG
2015-08-04 11:14
639 查看
一、参考文章:
二、编译环境:
CentOS10
工具包:
NDK:
SDK:
Ffmpeg:
三、NDK的安装
l下载:
l解压
//复制文件
cpandroid-ndk-r8b-linux-x86.tar.bz2/usr/local/lib
//解压文件
tarjxvfandroid-ndk-r8b-linux-x86.tar.bz2
l修改环境变量
终端运行:gedit
~/.bashrc
将下面的语句加入
#NDKsetting
NDK_ROOT=/usr/local/lib/android-ndk-r8b
exportNDK_ROOT
保存,终端运行:source~/.bashrc
使之立即生效。
在终端运行:echo$NDK_ROOT
若正确打印了NDK的路径,说明环境变量修改成功。
l测试
cd进入android-ndk-r8b/samples/hello-jni,然后在终端运行ndk的编译脚本:
sudo
/usr/local/lib/android-ndk-r8b/ndk-build
若结果如下图,则ndk安装成功。
四、
编译FFMPEG
l解压
tar-xvjfffmpeg-2.7.2.tar.bz2
cdffmpeg-2.7.2
l配置文件my-make.sh
geditmy-make.sh
将下面的代码拷贝到my-make.sh中
#!/bin/bash
NDK=/opt/adrd-stuff/android-ndk-r10b
SYSROOT=$NDK/platforms/android-19/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
functionbuild_one
{
./configure\
--prefix=$PREFIX\
--enable-shared\
--disable-static\
--disable-doc\
--disable-ffserver\
--enable-cross-compile\
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-\
--target-os=linux\
--arch=arm\
--sysroot=$SYSROOT\
--extra-cflags="-Os-fpic$ADDI_CFLAGS"\
--extra-ldflags="$ADDI_LDFLAGS"\
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
make-j8
makeinstall
##endofmy-make.sh
l修改文件configure
很多ffmpeg编译资料上面说要修改configure文件,说的原因是如果不修改的话,在android上
System.loadLibrary("xxx");的时候个别so库无法加载的问题。
打开ffmpeg源码内configure文件进行如下修改:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
替换为:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
l编译
chmod+xmy-make.sh
mkdirandroid/arm-p
./my-make.sh
最后就可以在android/arm下面:
~~~~~~~~~~~/android/arm$ls
binincludelibshare
五、Android使用编译好的so库
l项目目录
lAndroid.mk
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_MODULE:=avcodec-56-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libavcodec-56.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=avdevice-56-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libavdevice-56.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=avfilter-5-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libavfilter-5.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=avformat-56-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libavformat-56.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=avutil-54-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libavutil-54.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=avswresample-1-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libswresample-1.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=swscale-3-prebuilt
LOCAL_SRC_FILES:=ffmpeg/lib/libswscale-3.so
include$(PREBUILT_SHARED_LIBRARY)
include$(CLEAR_VARS)
LOCAL_MODULE:=ffmpeg_codec
LOCAL_SRC_FILES:=FFmpegNative.c
LOCAL_LDLIBS:=-llog#-ljnigraphics-lz-landroid
LOCAL_C_INCLUDES+=$(LOCAL_PATH)/ffmpeg/include
LOCAL_SHARED_LIBRARIES:=\
avcodec-56-prebuilt\
avdevice-56-prebuilt\
avfilter-5-prebuilt\
avformat-56-prebuilt\
avutil-54-prebuilt
include$(BUILD_SHARED_LIBRARY)
lApplication.mk
APP_PLATFORM:=android-17
APP_ABI:=armeabi-v7a
APP_OPTIM:=debug
APP_STL:=gnustl_static
APP_CPPFLAGS+=-fexceptions
APP_CPPFLAGS+=-frtti
lFFmpegNative.c
#include<jni.h>
#include"libavcodec/avcodec.h"
#include"libavutil/imgutils.h"
#include"libavutil/samplefmt.h"
#include"libavutil/timestamp.h"
#include"libavformat/avformat.h"
jstring
Java_com_example_ffmpegtst_MainActivity_stringFromJNI(JNIEnv*env,
jobjectthiz)
{
charstr[25];
sprintf(str,"%d",avcodec_version());
return(*env)->NewStringUTF(env,str);
}
lMainActivity.java
packagecom.example.ffmpegtst;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.widget.TextView;
publicclassMainActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView)findViewById(R.id.hello_jni)).setText(stringFromJNI());
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
static{
System.loadLibrary("avutil-54");
System.loadLibrary("avcodec-56");
System.loadLibrary("swresample-1");
System.loadLibrary("avformat-56");
System.loadLibrary("swscale-3");
System.loadLibrary("avfilter-5");
System.loadLibrary("ffmpeg_codec");
}
publicnativeStringstringFromJNI();
}
六、注意:
NDK版本:
32bits小机用:
64bits小机用:
64bits编译出来的APK在S3上面运行,会有闪退的现象,
E/dalvikvm(31393):dlopen("/data/app-lib/com.az.ffmpegapp-1/libavformat-56.so")failed:dlopenfailed:cannotlocatesymbol"atof"referencedby"libavformat-56.so"...
W/dalvikvm(31393):ExceptionLjava/lang/UnsatisfiedLinkError;thrownwhileinitializingLcom/az/ffmpegapp/FFmpegNative;
E/AndroidRuntime(31393):Process:com.az.ffmpegapp,PID:31393
E/AndroidRuntime(31393):atcom.az.ffmpegapp.FFmpegNative.<clinit>(FFmpegNative.java:7)
E/AndroidRuntime(31393):atcom.az.ffmpegapp.MainActivity.onCreate(MainActivity.java:15)
W/ActivityManager(834):Forcefinishingactivitycom.az.ffmpegapp/.MainActivity
相关文章推荐
- linux rm 删除指令新用
- centOS 安装mysql5.5版本
- [linux]解决DNS配置重启丢失
- CentOS 有gcc没有g++
- Linux命令详解 -- cat tac more less head tail
- linux 下编译安装Qt
- Linux cronolog
- Linux下autoconf和automake使用
- Linux块设备驱动
- 优化或修改CentOS最大连接数限制
- linux常用搜索文件命令
- Linux设备驱动核心理论(一)
- linux下查找的相关命令
- linux运维必会MySQL企业面试题近百个
- linux运维必会MySQL企业面试题近百个
- linux运维必会MySQL企业面试题近百个
- Linux下python升级步骤
- 深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
- Linux IIC驱动
- 安装 CentOS 6.6