前言:
如今兄弟们对“ubuntu编译so库”可能比较关注,朋友们都需要分析一些“ubuntu编译so库”的相关内容。那么小编在网上收集了一些对于“ubuntu编译so库””的相关知识,希望兄弟们能喜欢,兄弟们快快来学习一下吧!前言
关于ffmpeg so库的编译,网上存在各种教程。有些基于windows,有些基于linux~而基于linux的:一般会选择安装虚拟机,在其上跑ubuntu系统。其实各种方式都是可以的,只要最后可以编译出我们需要的so库,就是正道。
win10开始自带了linux的子系统,我们可以直接使用该子系统进行编译工作,而无需安装虚拟机等繁琐流程。本章将详细罗列完整流程,大致流程会跟网上类似,但也有更新:
编译新版的ffmpegdemo中会使用ffmpeg新版的api(注:网上好多教程的demo部分其实无法正常使用,部分api在新版已经废弃)开启linux子系统启用子系统服务
打开【启用或关闭 Windows 功能】,勾选【适用于Linux的Windows子系统】或【Windows Subsystem For Linux】
安装完成后,重启电脑
安装linux
打开Microsoft store,搜索linux
这里选择安装Ubuntu 18.04 LTS(当然,版本可以自己选择适用的)
启动ubuntu
安装完成后,即可在开始菜单启动该ubuntu子系统。该子系统纯命令模式,大伙可以在编译过程中顺便熟悉下linux的命令,哈哈~
编译准备
先安装和下载需要的文件,并配置好环境
创建ffmpeg文件夹(非必须)
只是为了将所有资源整合到一起,统一管理,可以忽略该流程
下载ffmpegwget ffmpeg.org/releases/ff…下载ndkwget dl.google.com/android/rep…
安装jdk并解压ndk
为什么需要这么繁琐,还要安装jdk呢?本来打算安装unzip用于解压ndk的,但是由于文件过大,unzip解压会失败,最后选择使用jar进行解压
sudo apt-get install default-jdkjar xvf android.zip安装vim
主要用于编辑编译脚本,当然也可以使用其他的文本编辑器进行
sudo apt-get install vim
相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~
编译调整configure文件,修改生成生成以lib为前缀,.so为后缀的so库
这里可以使用vim进行修改。vim的查找快捷键为:先按ESC键,然后再 / , 输入需要搜索的关键字
修改前: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)'
编写编译脚本:android_build.sh
#!/bin/bashNDK_DIR=/home/king/ffmpeg/android-ndk-r16bSYSROOT=${NDK_DIR}/platforms/android-19/arch-arm/TOOLCHAIN=${NDK_DIR}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64function android_build{./configure \--prefix=$PREFIX \--disable-doc \--enable-shared \--disable-static \--disable-symver \--enable-gpl \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-doc \--disable-symver--cross-prefix=${TOOLCHAIN}/bin/arm-linux-androideabi- \--target-os=android \--arch=arm \--enable-cross-compile \--sysroot=${SYSROOT} \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake install}CPU=armv7-aPREFIX=./android/$CPUADDI_CFLAGS="-marm"android_build给编译脚本增加权限sudo chmod -R 777 android_build.sh开始编译./android_build.sh完成
编译完成后,会在当前目录/android/armv7-a/目录下看到生成的so库
so库的使用
使用新版的android studio可以很方便的给现有项目增加c++,直接在对应的module右键,选择Add C++ to Module,即可生成需要的文件。这里不使用这种便捷方式,而是使用最原始的流程,一步一步的构建整个流程。
创建FFmpegUtil类并声明本地方法
public class FFmpegUtil { static { System.loadLibrary("ffmpegdemo"); } //JNI public native String avformatinfo(); public native String avcodecinfo(); public native String protocols(); public native String bsf();}使用javac编译源文件FFmpegUtil.java,生成FFmpegUtil.class
执行javac FFmpegUtil.java即可(该步骤在所在源文件目录执行)
使用javah -jni生成C头文件
javah用法: javah [options] <classes>其中, [options] 包括: -o <file> 输出文件 (只能使用 -d 或 -o 之一) -d <dir> 输出目录 -v -verbose 启用详细输出 -h --help -? 输出此消息 -version 输出版本信息 -jni 生成 JNI 样式的标头文件 (默认值) -force 始终写入输出文件 -classpath <path> 从中加载类的路径 -cp <path> 从中加载类的路径 -bootclasspath <path> 从中加载引导类的路径<classes> 是使用其全限定名称指定的(例如, java.lang.Object)。根据说明,执行的命令应该为:javah -jni com.example.ffmpegdemo.FFmpegUtil
这里有一点需要注意的是,执行目录不是在FFmpegUtil.class所在的路径,而应该是在app\src\main\java\路径下
执行成功后,可以在该目录下看到生成了com_example_ffmpegdemo_FFmpegUtil.h文件
用C代码或CPP代码写函数原型的实现
在app\src\main\下增加cpp文件夹创建可以在该目录下看到生成了com_example_ffmpegdemo_FFmpegUtil.cpp文件,实现具体的函数添加ffmpeg so库的引用在app\路径下添加libs文件夹将几个平台的so库添加到libs目录下将相应的头文件添加到libs目录下,统一放在include下在module的build.gradle配置相关信息
android { defaultConfig { ... externalNativeBuild { cmake { cppFlags "-std=c++11" abiFilters "armeabi-v7a" } } ndk { //我们只有armeabi-v7a就只配置这个就行了 abiFilters 'armeabi-v7a' } }}编写CMakeLists.txt文件
CMake文件的编写,官方有详细的教程:配置CMake。主要工作就是配置引用的so库和相应的头文件等消息,具体内容可看demo。
在module的build.gradle配置CMakeLists.txt
android { ... externalNativeBuild { cmake { // 要注意相对路径,我这里直接放在app\路径下 path file('CMakeLists.txt') } }}使用
基本配置完成,可以正常的在module中使用FFmpegUtil提供的native方法啦~上图两张:
总结
总的流程下来,主要包含两方面:
如何不安装虚拟机编译新版ffmpeg的so库如何使用编译出来的so库,即一般ndk的开发流程 当然,就像上边提及的,android studio对于ndk开发支持越来越好,也越来越简便。那为什么上边没有使用简便的方法呢?有时候你需要自己一步一步进行开发才能理解ADT在背后为我们做了哪些事情,假如脱离ADT我们可以怎么去完成相应的事情。
最后附上demo地址:gitee-demo
原文 ffmpeg源码编译详细过程与使用(含demo) - 掘金
标签: #ubuntu编译so库 #jar如何解压 #有源码怎么编译成文件 #ubuntujar解压