1. 程式人生 > >Android NDK開發(一)CMake構建工具使用

Android NDK開發(一)CMake構建工具使用

  一、Android studio中需要的外掛:  

  CMake  

  LLDB  

  NDK  

二、專案配置

  專案目錄

  ①build.gardle的配置  :多了兩個externalNativeBuild :defaultConfig下的、和defaultConfig 並行下的externalNativeBuild

   a、defaultConfig下的   

 defaultConfig {
        ...
        externalNativeBuild {
                cmake {
                    cppFlags 
"" //cppFlags "-fexceptions -frtti" ,在AndroidStudio新建專案->選擇C++版本時,勾選•Exceptions Support和•Runtime Type Information Support時會有, } } }

  注:   

  Exceptions Support:支援C++異常處理   

  Runtime Type Information Support:支援執行時型別識別, 程式能夠使用基類的指標或引用來檢查這些指標或引用所指的物件的實際派生型別  

  b、和defaultConfig 並行下的externalNativeBuild ,指定CMakeLists.txt的路徑    

externalNativeBuild {
    cmake {
       path "CMakeLists.txt"
       }
}

  ②CMake的構建指令碼

# 設定Cmake最小版本
cmake_minimum_required(VERSION 3.4.1)

# 編譯library
add_library( # 設定library名稱
     native-lib

     # 設定library模式,SHARED模式會編譯so檔案,STATIC模式不會編譯
     SHARED

     # 設定原生程式碼路徑
     src
/main/cpp/native-lib.cpp ) # 定位library find_library( # library名稱 log-lib # 將library路徑儲存為一個變數,可以在其他地方用這個變數引用NDK庫 # 在這裡設定變數名稱 log )
# 關聯library target_link_libraries( # 關聯的library
native-lib # 關聯native-lib和log-lib ${log-lib} )

  ③Cpp程式碼和Android程式碼呼叫

   Cpp程式碼:  

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_yl_ndkdemo_MainActivity_stringFromJNI(
     JNIEnv *env,
    jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

  Android程式碼:  

public class MainActivity extends AppCompatActivity {

     // 載入native-lib,不加lib字首
    static {
     System.loadLibrary("native-lib");
     }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
    
    // 將獲取的字串顯示在TextView上
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
    }
    /**
     * native-lib中的原生方法
     */
    public native String stringFromJNI();
} 

  ④so檔案的生成  

  在CMakeLists.txt中將library的編譯模式設定為SHARED模式,點選AS的編譯按鈕,在app > build > intermediates > cmake > debug > obj目錄下會生成不同CPU架構對應的so檔案  

  不同架構的指定:

defaultConfig {
    ...       
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64", "mips", "mips64"
    }
}

  ⑤so檔案的位置  

   在專案的app > src > main目錄下建立jniLibs資料夾,將生成的so檔案(帶著CPU架構目錄)拷貝到jniLibs資料夾中

 

 

參考:https://blog.csdn.net/kong_gu_you_lan/article/details/79091789