接續上個系列之 __[ JNI開發系列 ]__:
[JNI開發系列①JNI概念及開發流程](http://www.jianshu.com/p/68bca86a84ce)
[JNI開發系列②.h頭文件分析](http://www.jianshu.com/p/cba836f6a08c)
[JNI開發系列③C語言調用Java字段與方法](http://www.jianshu.com/p/9cc6e3f0ead7)
[JNI開發系列④C語言調用構造方法](http://www.jianshu.com/p/b0403771944f)
[JNI開發系列⑤對象引用的處理](http://www.jianshu.com/p/09469f692a4b)
### 前情提要
上個系列,我們學習了Java與C/C++的交互 , 使用Java調用C/C++函數,使用C/C++調Java的方法和創建Java對象等等 。在上個系列中 , 我們使用的是Eclipse與VS進行的開發 , 因為延續的是[C語言基礎系列](http://www.jianshu.com/p/4701cd1e1914)的做法 , 所以開發工具未作切換 。 在NDK系列中 , 我們將采用最新的Android Studio進行開發 , 版本是`Android studio 2.2 RC 2` , NDK版本采用的是最新的`r12b` 。
### 開發環境
工具下載地址 (win)(需要科學上網) :
Android Studio 2.2 RC2 --- [Android Studio Download 2.2 RC2](https://dl.google.com/dl/android/studio/ide-zips/2.2.0.11/android-studio-ide-145.3253452-windows.zip)
Android NDK r12b --- [Android NDK r12b 64bit](https://dl.google.com/android/repository/android-ndk-r12b-windows-x86_64.zip)
Android NDK r12b --- [Android NDK r12b 32bit](https://dl.google.com/android/repository/android-ndk-r12b-windows-x86.zip)
> 國內鏡像站:
[androiddevtools](http://www.androiddevtools.cn/)
### 關于開發環境的說明
因為在`Android studio 2.2`之前的版本 , 對C/C++支持不是很好 , 也沒有語法提示 , 寫起來不是很方便 , 構建工具也不是很完整 , 所有采用最新的`Android studio 2.2 RC2`來進行編寫 ,但 , `Android studio 2.2 RC2` 還是Beta版本 ,所有 , 不建議現在應用到生產環境中 , 等google發布了Stable版本之后再應用 。 目前建議 , 可以使用`Eclipse`編寫`.so` , 然后應用到現在的生產環境中 。
### 創建NDK項目
> 第一步 , 創建支持C++的項目

其他的選項使用默認的即可 。
> 第二步 , 關聯NDK
創建完成之后會報如下錯誤:

在項目配置中 , 關聯NDK之后就會ok

> 第三步 , 編寫native類及處理方法
在創建項目的時候 , 勾選了C++ support , 項目創建完成之后 , 會自動幫我們生成一個`cpp/native-lib.cpp`

你可以不用修改文件名 , 在新建`native`方法的時候 , 會提示你創建一個C++的JNI函數 , 直接創建就會生成一個JNI函數 , 都不用使用`javah`生成一個頭文件 , 然后再引入頭文件了 , 非常之方便 。

創建函數:

在這里 , 就不使用默認的`.cpp`文件了 , 我們新建一個`.c`文件 , 創建了`HelloNDK.c`文件之后 , Android Studio會提示我們 , 需要在`Android.mk/CMakeLists.txt`中進行聲明 , 這里 , 我們使用默認的`CMakeLists.txt`建構工具 (創建項目的時候自動生成)。
> 第四步 , build.gradle配置:
```java
externalNativeBuild {
cmake {
cppFlags ""
// 指定只用clang編譯器
// Clang是一個C語言、Objective-C、C++語言的輕量級編譯器。
arguments "-DANDROID_TOOLCHAIN=clang"
// 生成.so庫的目標平臺
abiFilters "armeabi-v7a" , "armeabi"
}
}
// 配置CMakeLists.txt路徑
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
```
> 第五步 , 修改CMakeLists.txt
```
add_library( # Sets the name of the library.
HelloNDK # 生成的.so庫文件名稱
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
# Associated headers in the same location as their source
# file are automatically included.
# 需要生成的.so庫的文件路徑
src/main/cpp/HelloNDK.c
)
target_link_libraries( # Specifies the target library.
# 項目鏈接的.so庫名稱
HelloNDK
# Links the target library to the log library
# included in the NDK.
${log-lib} )
```
> 第六步 , 編寫`native`方法,以及C函數
```java
/**
* Created by Zeno on 2016/9/10.
*
* NDK Demo
*/
public class HelloNDK {
public static native String sayHelloNDK() ;
static {
System.loadLibrary("HelloNDK");
}
}
```
```c
#include <jni.h>
JNIEXPORT jstring JNICALLJava_com_zeno_encryptanddecrypt_ndk_HelloNDK_sayHelloNDK(JNIEnv *env, jclass thiz) {
// TODO
return (*env)->NewStringUTF(env, "this String come from C ");
}
```
`native`方法的編寫以及C函數的寫法, 我們都非常熟悉了 , 這里就不再解釋各自的意義了 。
> 第七步 , 編譯

編譯完成之后 ,我們可以切換到`project`視圖,來查看`.so`文件

> 第八步 , 運行

如果使用的是genymotion模擬器 , 這需要在`abiFilters`加入`x86` ,不然項目會運行不起來的 。 當然, 也可以使用一個genymotion的`arm`插件 , 這樣不配置`x86`也可以運行 。
```
// 生成.so庫的目標平臺
abiFilters "armeabi-v7a" , "armeabi" , "x86"
```
### 結語
做為Android開發者 , 從最開始的Eclipse開發工具 , 到現在日漸成熟的Android Studio , 還有幾乎可以看得見成長的Android System , 我很慶幸 , 從一開始就選擇了Android平臺 , 從初學Android到現在的日漸深入 , Android在成長 , 我也在成長 。見證了Android從一個丑小鴨變成了 , 一個羽翼漸豐的白天鵝 , 不論從操作系統的易用性和UI友好性 , 它的成長都是有目共睹的 。感謝Android 。
> 每一個人的成長背后 , 都離不開所有人支持 , 我們是一個單獨的個體 , 又是社會網狀結構的一個點 , 我們既獨立又互相聯系 。
本文由[動腦學院](http://www.dongnaoedu.com/)特約贊助 , 祝各位老司機節日快樂 !
### 關于Android Studio 2.2
我很期待這個版本 , 對于C/C++的支持非常友好 , 省卻了很多繁瑣的操作 , 比Eclipse好用的太多 。
### 參考
[Building C++ in Android Studio with CMake or ndk-build](http://tools.android.com/tech-docs/external-c-builds)
- 簡介
- C語言基礎及指針①語法基礎
- C語言基礎及指針②之指針內存分析
- C語言基礎及指針③函數與二級指針
- C語言基礎及指針④函數指針
- C語言基礎及指針⑤動態內存分配
- C語言基礎及指針⑥字符操作
- C語言基礎及指針⑦結構體與指針
- C語言基礎及指針⑧文件IO
- C語言基礎及指針⑨聯合體與枚舉
- C語言基礎及指針⑩預編譯及jni.h分析
- JNI開發系列①JNI概念及開發流程
- JNI開發系列②.h頭文件分析
- JNI開發系列③C語言調用Java字段與方法
- JNI開發系列④C語言調用構造方法
- JNI開發系列⑤對象引用的處理
- NDK開發基礎①使用Android Studio編寫NDK
- NDK開發基礎②文件加密解密與分割合并
- NDK開發基礎③增量更新之服務器端生成差分包
- C++基礎①命名空間結構體和引用