??最近在學(xué)習(xí)語音編解碼旋奢,但語音編解碼庫用的是 C/C++ 寫的,所以不得不接觸了一下 JNI 。對于 JNI 最大的感觸就是門檻巨高胧砰,用 AndroidStudio 開發(fā)的資料非常少,感覺找不到路苇瓣,還曾幻想出現(xiàn)一個如玄幻小說主人公一樣有個名師在身邊指導(dǎo)下尉间,呵呵。走了很多彎路击罪,看了很多博客哲嘲,最終在簡書找到了很多資料 (發(fā)現(xiàn)簡書資料都挺新的) ,才寫出了個 HelloWord媳禁,但還蠻開心的眠副。
JNI 和 NDK
JNI (Java Native Interface) 是一套編程接口,用來實現(xiàn) Java 代碼和其他語言 (c/c++) 進(jìn)行交互竣稽。JNI 是 Java 語言的特性 (即 Java 接入 c/c++ 的一套方法)囱怕,與 Android 沒有關(guān)系。在 Windows 下面用 Java 做開發(fā)也經(jīng)常會用到 JNI 毫别,例如讀寫系統(tǒng)注冊表娃弓。
NDK (Native Development Kit) 是 Google 提供的一套工具集,可以讓你在 AndroidStudio 上編譯其他語言 (c/c++) 拧烦。并且 NDK 可以編譯多平臺的動態(tài)庫 (.so 文件)忘闻。
為啥要有 JNI
因為 C/C++ 語言編譯后的文件可以直接在本地系統(tǒng)中運(yùn)行,而 Java 文件編譯后生成的是字節(jié)碼文件恋博,需要依賴 Java 虛擬機(jī)來運(yùn)行齐佳,C/C++ 運(yùn)行效率高。另一方面债沮,字節(jié)碼文件很容易被反編譯炼吴,不安全。而且疫衩,硬件相關(guān)驅(qū)動硅蹦、許多知名的音視頻編碼庫 (例如 slik/G729) 也是 C/C++ 編寫的。Java 程序想要執(zhí)行高性能的代碼、想要高安全性或者需要調(diào)用系統(tǒng)驅(qū)動和重用已有的音視頻解碼庫童芹,那么就不得不使用 JNI 了涮瞻。
用 JNI 寫個 HelloWord
Android Studio NDK開發(fā)-環(huán)境配置
使用Android Studio 進(jìn)行NDK開發(fā)和調(diào)試
javah
$JDKPath$/bin/javah
-encoding UTF-8 -d ../jni -jni $FileClass$
$SourcepathEntry$..\java
ndk-build
F:\android-sdk\ndk-bundle\build\ndk-build.cmd
$ModuleFileDir$\src\main
ndk-build clean
F:\android-sdk\ndk-bundle\build\ndk-build.cmd
clean
$ModuleFileDir$\src\main