這裏先作一個道歉,由於我還大三,身上還有很多課程。最近五門的必修課壓身因此更新的進度上會有嚴重的脫節,可是我仍是會盡可能保證一週一篇文章的,但願可以理解。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
直接推到虛擬機中的。
以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。
相關文章推薦: