Android NDK開發基礎 使用Android Studio編寫NDK

前情提要
首先我們得學習了Java與C/C++的交互 , 使用Java調用C/C++函數,使用C/C++調Java的方法和創建Java對象等等 。在上個系列中 , 我們使用的是Eclipse與VS進行的開發 , 因爲延續的是C語言基礎系列的做法 , 所以開發工具未作切換 。 在NDK系列中 , 我們將採用最新的Android Studio進行開發 , 版本是Android studio 2.2 RC 2 , NDK版本採用的是最新的r12b 。

開發環境
工具下載地址 (win)(需要科學上網) :
Android Studio 2.2 RC2 --- Android Studio Download 2.2 RC2
Android NDK r12b --- Android NDK r12b 64bit
Android NDK r12b --- Android NDK r12b 32bit

國內鏡像站:
androiddevtools

關於開發環境的說明
因爲在Android studio 2.2之前的版本 , 對C/C++支持不是很好 , 也沒有語法提示 , 寫起來不是很方便 , 構建工具也不是很完整 , 所有采用最新的Android studio 2.2 RC2來進行編寫 ,但 , Android studio 2.2 RC2 還是Beta版本 ,所有 , 不建議現在應用到生產環境中 , 等google發佈了Stable版本之後再應用 。 目前建議 , 可以使用Eclipse編寫.so , 然後應用到現在的生產環境中 。

創建NDK項目

第一步, 創建支持C++的項目

圖片描述
C++ support

其他的選項使用默認的即可 。

第二步 , 關聯NDK

創建完成之後會報如下錯誤:

圖片描述

ndk r12b

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

圖片描述

config ndk

第三步 , 編寫native類及處理方法

在創建項目的時候 , 勾選了C++ support , 項目創建完成之後 , 會自動幫我們生成一個cpp/native-lib.cpp

圖片描述

auto create cpp file

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

圖片描述

auto create jni function 1

創建函數:

圖片描述

auto create jni function 2

在這裏 , 就不使用默認的.cpp文件了 , 我們新建一個.c文件 , 創建了HelloNDK.c文件之後 , Android Studio會提示我們 , 需要在Android.mk/CMakeLists.txt中進行聲明 , 這裏 , 我們使用默認的CMakeLists.txt建構工具 (創建項目的時候自動生成)。

第四步 , build.gradle配置:
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函數
/**
 * Created by Zeno on 2016/9/10.
 *
 * NDK Demo
 */
 
public class HelloNDK {
 
    public static native String sayHelloNDK() ;
 
    static {
        System.loadLibrary("HelloNDK");
    }
}
 
#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函數的寫法, 我們都非常熟悉了 , 這裏就不再解釋各自的意義了 。

第七步 , 編譯

圖片描述
make

編譯完成之後 ,我們可以切換到project視圖,來查看.so文件
圖片描述
make success

第八步 , 運行

圖片描述
run

如果使用的是genymotion模擬器 , 這需要在abiFilters加入x86 ,不然項目會運行不起來的 。 當然, 也可以使用一個genymotion的arm插件 , 這樣不配置x86也可以運行 。

// 生成.so庫的目標平臺
abiFilters "armeabi-v7a" , "armeabi" , "x86"

結語
做爲Android開發者 , 從最開始的Eclipse開發工具 , 到現在日漸成熟的Android Studio , 還有幾乎可以看得見成長的Android System , 我很慶幸 , 從一開始就選擇了Android平臺 , 從初學Android到現在的日漸深入 , Android在成長 , 我也在成長 。見證了Android從一個醜小鴨變成了 , 一個羽翼漸豐的白天鵝 , 不論從操作系統的易用性和UI友好性 , 它的成長都是有目共睹的 。感謝Android 。
寫的不好,有什麼不對的地方歡迎來噴,有大佬有不同的見解歡迎一起來探討交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章