轉(zhuǎn)載請標(biāo)明地址 QuincySx: http://www.reibang.com/p/c6108131ba0f
眾所周知現(xiàn)在 Android 開發(fā)已經(jīng)到了 Android Studio 的時(shí)代猜惋,那么 JNI 的調(diào)用方式也經(jīng)過了好幾代
- 在eclipse 時(shí)代就存在的 ndk-build 方式
- 使用 Google 官方的 com.android.tools.build:gradle-experimental 簡書地址
- CMake 方式堪遂,支持?jǐn)帱c(diǎn)調(diào)試陡舅,這也是今天要說的是一種方式
使用 CMake 這種方式有幾個條件
- Android Studio 2.2 或更高版本
- Android Plugin for Gradle 版本 2.2.0 或更高版本
好了下面需要下點(diǎn)必要工具 下載 NDK 和構(gòu)建工具 要為您的應(yīng)用編譯和調(diào)試原生代碼吮旅,您需要以下組件:
Android 原生開發(fā)工具包 (NDK):這套工具集允許您為 Android 使用 C 和 C++ 代碼,并提供眾多平臺庫蚓土,讓您可以管理原生 Activity 和訪問物理設(shè)備組件肖粮,例如傳感器和觸摸輸入革半。
CMake:一款外部構(gòu)建工具砂蔽,可與 Gradle 搭配使用來構(gòu)建原生庫洼怔。如果您只計(jì)劃使用 ndk-build,則不需要此組件察皇。
LLDB:一種調(diào)試程序,Android Studio 使用它來調(diào)試原生代碼泽台。
如圖顯示的三個 就是需要下載的三個
使用 CMake 有兩種方式
- 第一種方式 是在項(xiàng)目創(chuàng)建的時(shí)候
- 第二種是在現(xiàn)有項(xiàng)目上添加
第一種方式
我們先介紹第一種方式 : 是建立新項(xiàng)目的時(shí)候
復(fù)選 include C++ support 然后和正常項(xiàng)目一樣一直 Next 下一步
- C++ Standard:使用下拉列表選擇您希望使用哪種 C++ 標(biāo)準(zhǔn)什荣。選擇 Toolchain Default 會使用默認(rèn)的 CMake 設(shè)置。
- Exceptions Support:如果您希望啟用對 C++ 異常處理的支持怀酷,請選中此復(fù)選框稻爬。如果啟用此復(fù)選框,Android Studio 會將 -fexceptions 標(biāo)志添加到模塊級 build.gradle 文件的 cppFlags 中蜕依,Gradle 會將其傳遞到 CMake桅锄。
- Runtime Type Information Support:如果您希望支持 RTTI,請選中此復(fù)選框样眠。如果啟用此復(fù)選框友瘤,Android Studio 會將 -frtti 標(biāo)志添加到模塊級 build.gradle 文件的 cppFlags 中,Gradle 會將其傳遞到 CMake檐束。
根據(jù)自己情況選取 飯后點(diǎn)擊 Finish
在這種情況下 如果沒有安裝 CMake Android Studio 會提示安裝
這是項(xiàng)目結(jié)構(gòu)
第二種方式
第二種方式是 : 在原有想的基礎(chǔ)上添加
這種方式有三個步驟
- 創(chuàng)建新的原生源文件并將其添加到您的 Android Studio 項(xiàng)目中辫秧。如果您已經(jīng)擁有原生代碼或想要導(dǎo)入預(yù)構(gòu)建的原生庫,則可以跳過此步驟被丧。
- 創(chuàng)建 CMake 構(gòu)建腳本將您的原生源代碼構(gòu)建到庫中盟戏。如果導(dǎo)入和關(guān)聯(lián)預(yù)構(gòu)建庫或平臺庫绪妹,您也需要此構(gòu)建腳本。如果您的現(xiàn)有原生庫已經(jīng)擁有CMakeLists.txt構(gòu)建腳本或者使用 ndk-build 并包含Android.mk構(gòu)建腳本柿究,則可以跳過此步驟邮旷。
- 提供一個指向您的 CMake 或 ndk-build 腳本文件的路徑,將 Gradle 關(guān)聯(lián)到您的原生庫蝇摸。Gradle 使用構(gòu)建腳本將源代碼導(dǎo)入您的 Android Studio 項(xiàng)目并將原生庫(SO 文件)打包到 APK 中婶肩。
首先在自己的模塊下新建 JNI 目錄
然后切換顯示模式為 project 在 src > main 下會出現(xiàn)一個 jni 的目錄 創(chuàng)建c文件 名字隨意
然后在新建的文件夾下創(chuàng)建 C 的文件
如果需要頭文件 則需要勾選 Create an associated header
然后創(chuàng)建 CMakeLists.txt 文件 在模塊根目錄下創(chuàng)建(名字一定要是 CMakeLists.txt)
然后我們需要在文件中添加 cmake_minimum_required() 與 add_library() 兩個方法
#指定 CMake 的最小版本
cmake_minimum_required(VERSION 3.4.1)
add_library(
#模塊名
native
#設(shè)置模塊是可共享的
SHARED
#C 文件的具體路徑 注意確認(rèn)文件名后綴
src/main/jni/native.cpp )
# 指定頭文件路徑 這里我沒有創(chuàng)建 頭文件先注釋掉
# include_directories(src/main/jni/)
然后關(guān)聯(lián) CMake 與 Gradle
自動的方式
選擇我們創(chuàng)建的 CMakeLists.txt 文件 點(diǎn)擊完成等待
手動方式
android {
...
defaultConfig {...}
buildTypes {...}
// Encapsulates your external native build configurations.
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
path "CMakeLists.txt"
}
}
}
然后在 JAVA 中調(diào)用
在 Java 代碼中 調(diào)用的時(shí)候 添加 這里的名字一定要和上面一致
static {
System.loadLibrary("native");
}
private native String getStr();
然后在書寫一下 C 文件 (這里我創(chuàng)建的是 C++ 文件)
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_a21vianet_quincysx_demo_jnidemo_MainActivity_getStr(JNIEnv *env, jclass type) {
char str[] = "我是C";
return (*env).NewStringUTF(str);
}
總結(jié)
這只是最簡單的一個 小例子,我水平不高也在學(xué)習(xí),深入學(xué)習(xí)后會有更多的文章分享給大家
水平問題探入,難免會有錯誤狡孔,多謝各位指正