这里先作一个道歉,由于我还大三,身上还有很多课程。最近五门的必修课压身因此更新的进度上会有严重的脱节,可是我仍是会尽可能保证一周一篇文章的,但愿可以理解。java
文章内容参考书目《音视频开发进阶指南 -- 基于 Android 与 iOS 平台的实践》android
GitHub传送门 |
---|
【1】【从零冲击音视频开发】音视频开发必备知识基础git
【2】【从零冲击音视频开发】移动环境搭建github
【3】【从零冲击音视频开发】FFmpeg的介绍和基本使用面试
其实不少网站都已经有过这样的介绍了,不过既然是本身的文章,仍是须要讲讲的,嘿嘿。建立一个新的AS
项目,而且选择到咱们的Native C++
的选项来建立咱们的项目。固然咱们里面会看到一个C++ standard
,我直接默认选的Toolchain Defalut
。bash
到了这里其实咱们的程序就能够运行了,不信你能够直接跑,不过看看代码,你会发现存在必定的不一样架构
Native C++
?这个问题是读者必须清楚的,Java
终究并非一门万能的语言,每门语言都是如此,有着本身的长处和局限性。否则为何还须要Binder
机制去调用一些底层的服务,由于不少东西,上层作不了。app
状况能够分为如下几种:ide
(1)应用程序须要一些平台的相关特性支持,而Java
层并无提供相应的API,(好比OpenSL ES的使用)。函数
(2)调用已然存在的用C\C++
编写的函数库。
(3)应用程序对一些关键操做存在必定的处理速度要求。
Native
代码(1)编写一个带native
方法的函数。
public class NativeTest {
public native void encode();
}
复制代码
就如上面通常建立一个文件,用native
修饰便可,可是你可能会看到这个函数爆红,其实没什么关系,咱们先用小锤子Build
一下,正常状况下是不会报错的,由于只是这个native
函数没有找到对应的C\C++
函数而已,并不影响咱们自己的Java
类。
(2)生成一个咱们须要的C\C++
文件了。
1. 切换到src/main/java目录下
2. 在Terminal中输入javah -jni 包名.带native的Java类
// 在个人项目中的语句
javah -jni com.clericyi.player.NativeTest
3. 获得一个格式为:(包名_类名).h的头文件,并将他移动到cpp的目录下
复制代码
(3)获得的.h的头文件并不可以被使用,天然须要.cpp的文件来支持使用了。(上图已经给出位置)
#include <jni.h>
#include <string.h>
#include "com_clericyi_player_NativeTest.h"
JNIEXPORT jstring JNICALL Java_com_clericyi_player_NativeTest_encode (JNIEnv *env, jobject) {
return env->NewStringUTF("Encoder encoding");
}
复制代码
(4)使用
其实这个时候仍是用不起来的,须要进行必定的配置才行,走完下面的流程应该就能看到咱们的运行效果了。
(1) 修改CMakeList.txt中的对应数据,添加建立的cpp文件
add_library(
# 。。。
audioencoder.cpp)
(2) app -> build.gradle
android {
defaultConfig {
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
cFlags "-DSTDC_HEADERS"
}
}
ndk {
// 能够加入x86等等,跟应用的手机架构相对应
// 写了几个,到时候build中就会生成几个
abiFilters "armeabi-v7a"
}
}
}
复制代码
由于咱们在开发过程当中必需要使用到NDK
,而NDK
的版本兼容是一个很重要的事情。为了能向下兼容一些版本,咱们选用低一级的版本便可。(下载路径:Prefereces -> Android SDK -> SDK Tools)
相信不少人会在查资料时发现别人安装的都是
NDK
,而我安装的是NDK(Side by Side)
,可是你在本身的AS上也一样的找不到咱们须要的NDK
。因此给出一个网址来给读者们做为安装的教程:安装及配置 NDK 和 CMake
什么叫作交叉编译?
三部分构成:
Android
或者iOS
简单来讲就是咱们本地PC
编译生成了一份给别人用的东西。
以LAME
做为示范例子,来作一个详细的示范。
这里已经再也不建议用书上的方法了,我试了一天了,太难调通了。这里仍是使用Android Studio
如今自动生成带有的解决方案 -- CMake
。
LAME
,把libmp3lame
下的文件和include
下的lame.h
文件全都移动到AS
中cpp\lame
的文件夹下。CMakeLists.txt
add_library( # Sets the name of the library.
# 资源库的目标名
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
# 咱们要放入的cpp文件
native-lib.cpp
# lame
lame/bitstream.c lame/encoder.c lame/gain_analysis.c
lame/lame.c lame/id3tag.c lame/mpglib_interface.c
lame/newmdct.c lame/presets.c lame/psymodel.c
lame/quantize.c lame/fft.c lame/quantize_pvt.c
lame/reservoir.c lame/set_get.c lame/tables.c
lame/takehiro.c lame/util.c lame/vbrquantize.c
lame/VbrTag.c lame/version.c)
复制代码
build
一下咱们的项目,会报错,我出现的错误即解决方案下方给出。错误1:#include <lame.h>
解决方案:#include "lame.h"
---
错误2:ieee754_float32_t fast_log2(ieee754_float32_t x);
解决方案:float fast_log2(float x);
复制代码
#include <jni.h>
#include <string.h>
#include "com_clericyi_player_NativeTest.h"
JNIEXPORT jstring JNICALL Java_com_clericyi_player_NativeTest_encode
(JNIEnv *env, jobject) {
return env->NewStringUTF(get_lame_version());
}
复制代码
能够把上文中使用过的那个C++
文件的返回值修改为这个,就可以获得效果了。
基本这就完事儿了,若是想要作更深层次的了解,你能够看这样项目结构用于自学,对应的项目中的内容是书上的一个用于将PCM
格式文件转化为MP3
格式的范例。
PCM
的文件能够本身去随便捞一个,由于求方便我是用adb
直接推到虚拟机中的。
以上就是个人学习成果,若是有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。
相关文章推荐: