java libffm,根据ffmpeg 生成android动态库

根据ffmpeg 生成android动态库

本次是在Ubuntu上进行编译ffmpeg库的 安装Ubuntu环境

1.安装完Ubuntu之后 使用命令行执行 依次以下命令:

apt-get update

apt-get install yasm

apt-get install pkg-config

2.在Ubuntu中下载ndk 以及 ffmpeg (目前在ubuntu不要使用最新的ndk以及ffmpeg 会出现一些未知的环境错误)

wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip

http://ffmpeg.org/releases/ffmpeg-3.4.5.tar.bz2

3.解压 ndk 以及ffmpeg

c5f893fca36b

image.png

unzip android-ndk-r14b-linux-x86_64.zip (比如解压到/home/wxj/ndk_build/android-ndk-r14b)

tar jxvf ffmpeg-3.4.5.tar.bz2 (比如解压到/home/wxj/ffmpeg/ffmpeg-3.4.5)

可能需要配置ndk环境path。

4.修改ffmpeg解压目录中的 configure

使用vim 打开 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)'

5.在ffmpeg-3.4.5目录下新建android_build.sh脚本文件

vim android_build.sh

添加以下代码:

#!/bin/bash

make clean

export NDK=/home/wxj/ndk_build/android-ndk-r14b

export SYSROOT=$NDK/platforms/android-21/arch-arm/

export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

export CPU=armv7-a

export PREFIX=$(pwd)/android/$CPU

export ADDI_CFLAGS="-marm"

./configure \

--target-os=android \

--arch=armv7-a \

--enable-mediacodec \

--enable-decoder=h264_mediacodec \

--enable-jni \

--enable-hwaccels \

--prefix=$PREFIX \

--disable-doc \

--enable-shared \

--disable-static \

--disable-yasm \

--disable-symver \

--enable-gpl \

--enable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-doc \

--disable-symver \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

6.赋予脚本执行权限:

chmod +x android_build.sh

执行脚本开始编译:

./android_build.sh

7.编译成功后会在 /home/wxj/ffmpeg/ffmpeg-3.4.5目录下生成一个android/armv7-a文件夹,里面有对应的so库(此时生成的so库android还不能直接使用)

c5f893fca36b

image.png

8.在ffmpeg-3.4.5目录下新建androidbuild文件夹 将步骤7 生成的obj文件夹复制过来 ,并且新建jni目录

c5f893fca36b

image.png

9.此步骤可以在as中完成 新建 FFmpegNative.java

package com.sz.ffmlib;

public class FFmpegNative {

public static native void run();

}

10.生成com_sz_ffmlib_FFmpegNative.h头文件

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_sz_ffmlib_FFmpegNative */

#ifndef _Included_com_sz_ffmlib_FFmpegNative

#define _Included_com_sz_ffmlib_FFmpegNative

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_sz_ffmlib_FFmpegNative

* Method: run

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_com_sz_ffmlib_FFmpegNative_run

(JNIEnv *, jclass);

#ifdef __cplusplus

}

#endif

#endif

11.写上Android.mk以及Application.mk

Android.mk:

```

LOCAL_PATH:= $(call my-dir)

INCLUDE_PATH:=/home/wxj/ffmpeg/ffmpeg-3.4.5/android/armv7-a/include

FFMPEG_LIB_PATH:=/home/wxj/ffmpeg/ffmpeg-3.4.5/android/armv7-a/lib

include $(CLEAR_VARS)

LOCAL_MODULE:= libavcodec

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavcodec.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavformat

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavformat.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libswscale

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libswscale.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavutil

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavutil.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavfilter

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavfilter.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libswresample

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libswresample.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libpostproc

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libpostproc.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavdevice

LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavdevice.so

LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := ffmpeg

LOCAL_SRC_FILES := com_sz_ffmlib_FFmpegNative.c

LOCAL_C_INCLUDES := /home/wxj/ffmpeg/ffmpeg-3.4.5

LOCAL_LDLIBS := -lm -llog

LOCAL_SHARED_LIBRARIES := libavcodec libavfilter libavformat libavutil libswresample libswscale libavdevice

include $(BUILD_SHARED_LIBRARY)

```

Application.mk:

APP_ABI := armeabi-v7a

APP_PLATFORM= android-14

12.实现.h文件的具体逻辑 com_sz_ffmlib_FFmpegNative.c(测试)

#include

#include "com_sz_ffmlib_FFmpegNative.h"

#include

#include

#include

#include "libavcodec/avcodec.h"

#include "libavformat/avformat.h"

#include "libavfilter/avfilter.h"

JNIEXPORT void JNICALL Java_com_sz_ffmlib_FFmpegNative_run(JNIEnv *env, jclass obj) {

char info[40000] = {0};

av_register_all();

AVCodec *c_temp = av_codec_next(NULL);

while(c_temp != NULL){

if(c_temp->decode!=NULL){

sprintf(info,"%s[Dec]",info);

}else{

sprintf(info,"%s[Enc]",info);

}

switch(c_temp->type){

case AVMEDIA_TYPE_VIDEO:

sprintf(info,"%s[Video]",info);

break;

case AVMEDIA_TYPE_AUDIO:

sprintf(info,"%s[Audio]",info);

break;

default:

sprintf(info,"%s[Other]",info);

break;

}

sprintf(info,"%s[%10s]\n",info,c_temp->name);

c_temp=c_temp->next;

}

__android_log_print(ANDROID_LOG_INFO,"myTag","info:\n%s",info);

}

13.在jni 目录下运行ndk-build脚本命令就可以生成动态库了 生成的动态库在jni/libs/armeabi-v7a下

c5f893fca36b

image.png

14.将生成的so放到项目的jniLibs里面

c5f893fca36b

image.png

调用:

c5f893fca36b

image.png

··

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值