本文你可以了解到
本文将介绍如何将上一篇文章编译出来的FFmpeg so
库,引入到Android
工程中,并验证so
是否可以正常使用。
一、开启 Android 原生 C/C++ 支持
在过去,通常使用 makefile
的方式在项目中引入 C/C++
代码支持,随着 Android Studio
的普及,makefile
的方式已经基本被 CMake
替代。
有了 Android
官方的支持,NDK
层代码的开发变得更加容易。以前一谈到 Android NDK
,许多人就会大惊失色,感觉是深不可测的东西,一方面是 makefile
的编写很难,一方面是 C/C++
相比 Java
来说,比较晦涩。
但是不必担心,一是有了 CMake
,二是对于 C/C++
的基本使用其实和 Java
差不多,本系列涉及到的,也都是对 C/C++
的基础使用,毕竟,高级的我也不会不是吗?哈哈哈~~
1. 安装 CMake
首先,需要下载 CMake
相关工具,在 Android Studio
中依次点击 Tools->SDK Manager->SDK Tools
,然后勾选
CMake
: CMake 构建工具
LLDB
: C/C++ 代码调试工具
NDK
: NDK 环境
最后依次点击 OK->OK->Finish
,开始下载(文件比较大,可能会比较慢,请耐心等待)。
下载CMake工具
2. 添加 C/C++ 支持
有两种方式:
一是,新建一个新的工程,并勾选C/C++
支持选项,系统将自动创建一个支持C/C++
编码的工程。
二是,在已有的项目上,手动添加所有的添加项来支持C/C++
编码,其实就是自己手动添加「第一种方式」
中Android Studio
为我们自动创建的那些东西。
首先,通过新建一个新工程的方式,看看 IDE
为我们生成了那些东西。
1)新建 C/C++ 工程
依次点击 File -> New -> New Project
,进入新建工程页面,拉到最后,选择 Native C++
然后按照默认配置,一路 Next -> Next -> Finish
即可。
新建C++工程
2)Android Studio 自动生成了什么
生成的工程目录如下:
工程目录
重点关注上图标注的3个地方:
- 第一,最上层的
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Example of a call to a native method
sample_text.text = stringFromJNI()
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
external fun stringFromJNI(): String
companion object {
// Used to load the 'native-lib' library on application startup.
init {
System.loadLibrary("native-lib")
}
}
}
很简单,使用过 so
库的应该都看得懂,这里简单说一下。
代码的最下面,companion object
在 Kotlin
中表示静态代码块,类似 Java
中的 static { }
,其中的代码有且只会被执行一次。
接着在 init{}
方法中,加载了 C/C++
代码编译成的 so
库: native-lib
。
往上一句代码,用 external
声明了一个外部引用的方法 stringFromJNI()
,这个方法和 C/C++
层的代码是对应的。
最终在最上面的 onCreate
中,将从 C/C++
层返回的 String