64 CentOS NDK 编译 FFMPEG

一、           参考文章:

http://www.cnblogs.com/baopu/p/4733029.html

http://www.cnblogs.com/wainiwann/p/3785485.html

二、 编译环境:

CentOS 10

工具包:

NDK: https://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2

SDK:https://dl.google.com/android/adt/adt-bundle-linux-x86_64-20140702.zip

Ffmpeg: http://ffmpeg.org/releases/ffmpeg-2.7.2.tar.bz2

三、           NDK的安装

下载: https://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2

解压

//复制文件  
cp android-ndk-r8b-linux-x86.tar.bz2 /usr/local/lib  
//解压文件  
tar jxvf android-ndk-r8b-linux-x86.tar.bz2

修改环境变量

终端运行:gedit 
~/.bashrc

将下面的语句加入

#NDK setting  
NDK_ROOT=/usr/local/lib/android-ndk-r8b  
export NDK_ROOT

保存,终端运行:source ~/.bashrc

使之立即生效。

在终端运行:echo $NDK_ROOT

若正确打印了NDK的路径,说明环境变量修改成功。

测试

cd 进入android-ndk-r8b/samples/hello-jni,然后在终端运行ndk的编译脚本:

sudo
/usr/local/lib/android-ndk-r8b/ndk-build

若结果如下图,则ndk安装成功。

 

 

四、          
编译FFMPEG

解压

tar -xvjf ffmpeg-2.7.2.tar.bz2

cd ffmpeg-2.7.2

配置文件my-make.sh

gedit my-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

function build_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

make install

## end of my-make.sh

修改文件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)'

编译

chmod +x my-make.sh

mkdir android/arm -p

./my-make.sh

最后就可以在android/arm下面:

~~~~~~~~~~~/android/arm$ ls

bin include lib share

 

五、           Android使用编译好的so

项目目录

Android.mk

 

LOCAL_PATH := $(call my-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)

Application.mk

 

APP_PLATFORM := android-17

APP_ABI := armeabi-v7a

APP_OPTIM := debug

APP_STL :=  gnustl_static

APP_CPPFLAGS += -fexceptions

APP_CPPFLAGS += -frtti

 

FFmpegNative.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,

jobject thiz )

{

char str[25];

sprintf(str, "%d", avcodec_version());

return (*env)->NewStringUTF(env, str);

}

MainActivity.java

 

 

package com.example.ffmpegtst;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.widget.TextView;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

((TextView)findViewById(R.id.hello_jni)).setText(stringFromJNI());

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

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");

}

public native String  stringFromJNI();

}

六、注意:

NDK版本:

32bits小机用:android-ndk32-r10b-linux-x86_64.tar.bz2

64bits小机用:android-ndk64-r10b-linux-x86_64.tar.bz2

64bits编译出来的APK在S3上面运行,会有闪退的现象,

E/dalvikvm(31393): dlopen("/data/app-lib/com.az.ffmpegapp-1/libavformat-56.so") failed: dlopen failed: cannot locate symbol "atof" referenced by "libavformat-56.so"...

W/dalvikvm(31393): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/az/ffmpegapp/FFmpegNative;

E/AndroidRuntime(31393): Process: com.az.ffmpegapp, PID: 31393

E/AndroidRuntime(31393): at com.az.ffmpegapp.FFmpegNative.<clinit>(FFmpegNative.java:7)

E/AndroidRuntime(31393): at com.az.ffmpegapp.MainActivity.onCreate(MainActivity.java:15)

W/ActivityManager( 834): Force finishing activity com.az.ffmpegapp/.MainActivity

64位 CentOS NDK 编译 FFMPEG的更多相关文章

  1. 64位centos 下编译 hadoop 2.6.0 源码

    64位os下为啥要编译hadoop就不解释了,百度一下就能知道原因,下面是步骤: 前提:编译源码所在的机器,必须能上网,否则建议不要尝试了 一. 下载必要的组件 a) 下载hadoop源码 (当前最新 ...

  2. 64位CentOS上编译 Hadoop 2.2.0

    下载了Hadoop预编译好的二进制包,hadoop-2.2.0.tar.gz,启动起来后.总是出现这样的警告: WARN util.NativeCodeLoader: Unable to load n ...

  3. openfl使用64位的ndk时,编译报错的问题!

    当使用64位的ndk时,如果使用openfl test android运行android测试,应该会出现 arm-linux-androideabi-g++:找不到这个命令的错误. 原因是,haxel ...

  4. 用Android NDK编译FFmpeg

    附(2018-01-06):     有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见:       https://github.com/writing ...

  5. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  6. Ubuntu12.04安装64位系统出现编译错误error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or dir

    问题: Ubuntu12.04安装64位系统出现编译错误error while loading shared libraries: libz.so.1: cannot open shared obje ...

  7. anroid ndk编译ffmpeg 引用librtmp libx264

    Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264.条条大路通罗马, 也许还有别的更好的方法去完 ...

  8. 在64位linux下编译32位程序

    在64位linux下编译32位程序 http://blog.csdn.net/xsckernel/article/details/38045783

  9. Hadoop 3.2.1 win10 64位系统 vs2015 编译

    Hadoop 3.2.1 win10 64位系统 vs2015 编译 1        环境配置 1.1   JDK下载安装 1.1.1         下载 JDK 1.8    (jdk1.8.0 ...

随机推荐

  1. 深入浅出Node.js (附录C) - Node编码规范

    C.1 根源 C.2 编码规范 C.2.1 空格与格式 C.2.2 命名规范 C.2.3 比较操作 C.2.4 字面量 C.2.5 作用域 C.2.6 数组与对象 C.2.7 异步 C.2.8 类与模 ...

  2. closest

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Selenium WebDriver + Grid2 + RSpec之旅(一)----准备篇

    Selenium WebDriver + Grid2 + RSpec之旅(一)             ----准备篇 前言 在Web 2.0 应用中,在浏览器种类盛行的时代,我们在测试过程中不仅要模 ...

  4. 利用NSIS软件制作C#安装包

    最近在做C#程序安装包,结果网上看到这个软件还是不错的,可以尝试以下. NSIS 是“Nullsoft 脚本安装系统”(Nullsoft Scriptable Installation System) ...

  5. 用Delphi制作仿每行带按钮的列表

    Delphi做程序开发在使用到列表控件时,一般是列表放文本内容,在列表以外放操作按钮,选中列表某项再点按钮进行操作.现在Web开发做列表的样式总是列表的每行都有操作按钮,如微博的列表风格: Web开发 ...

  6. UVAlive 3263 That Nice Euler Circuit(欧拉定理)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21363 [思路] 欧拉定理:V+F-E=2.则F=E-V+2. 其 ...

  7. linux驱动面试题目汇总

    http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何 ...

  8. hpuoj 1706: 牛B【正向拓扑】【建图】

    1706: 牛B 时间限制: 1 Sec  内存限制: 128 MB提交: 22  解决: 6[提交][状态][讨论版] 题目描述 一群来自日本恐怖分子带着AK47,火箭弹,开着坦克,带着飞机,强行洗 ...

  9. Properties/Property文件读取(键值均)乱码问题!

    方法一:使用native2ascii进行转码,这个不做说明,客户不可能帮你转码的. 方法二:当键是因为时直接getProperty即可,但加载后的propertis对象里的键也是中文乱码,就无法通过g ...

  10. VMware workstation12 pro安装Ubuntu14.04LTS过程笔记

    由于近期需要加强自己在Linux/C++编程方面的需要,把原来的CentOS6.5格了....在windows8.1系统上重新安装了VMware和Ubuntu... VMware安装Ubuntu的过程 ...