1. 程式人生 > >Android Studio 3.0 Jni 開發環境配置 ndk cmake編譯 多個C/C++檔案新增配置

Android Studio 3.0 Jni 開發環境配置 ndk cmake編譯 多個C/C++檔案新增配置

為什麼要用cmake?我先說一下cmake的優點:
1.配置簡單,只需要一個text檔案幾句程式碼即可完成Jni環境配置
2.請看下圖:
這裡寫圖片描述

這裡寫圖片描述
第一張圖是在幹什麼?debug C/C++程式碼啊!驚不驚險刺不刺激?!
都能夠直接debug了,新增檔案新增函式肯定超簡單的。
第二張圖片呢,查看了一下apk包裡面的內容可以看到所有c/c++程式碼都會自動被編譯成為so庫檔案才能釋出,java程式碼再混淆有so庫安全?
所以說cmake還是很好用的,畢竟官方推薦的。

開始配置:
找一個普通AS專案,也可以新建一個不用選C++支援,新增ndk及相關庫,File->Settings:
這裡寫圖片描述


如圖:新增CMake,LLDB(這個庫是debugC/C++程式碼時用的),NDK儲存等待安裝完畢。
在app目錄裡面新建一個CMakelists.text檔案,注意名稱,新增如下程式碼:

cmake_minimum_required(VERSION 3.4.1)

include_directories(
    ${CMAKE_SOURCE_DIR}/src/main/cpp/include #h檔案目錄
)
add_library( # Sets the name of the library.
             jni-lib                        #c/cpp程式碼將要編譯成為so庫的名稱,java程式碼載入庫檔案要用這個名稱
SHARED src/main/cpp/hello-cjni.c #c程式碼檔案路徑 src/main/cpp/hello-cppjni.cpp #cpp程式碼檔案路徑 這裡可以隨意新增c、c++檔案 ) target_link_libraries( # Specifies the target library. jni-lib )

所以可以看出以後要往專案當中新增c、cpp檔案就需要來cmakelists檔案當中進行新增設定。
然後把這個cmake配置檔案配置到AS當中:
在app:build.gradle 的android 裡面新增:

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

配置好長這個樣子:
這裡寫圖片描述
到此工程配置就完成了。下面使用:
src/main/cpp/ 在這個路徑下面新建兩個檔案:
一個:hello-cjni.c 一個:hello-cppjni.cpp 檔名稱和路徑跟cmakelist裡面的對應。
新建JniNative.java檔案,作為java與c程式碼解耦類建好以後AS長這個樣子:
說明一點:如果新建了c檔案但是AS當中看不到則說明沒有在cmakelist裡面配置好或者還沒有執行cmakelist檔案:
這裡寫圖片描述
在JniNativ.java裡面新增如下程式碼:
這裡寫圖片描述
“jni-lib”這個名字是跟cmakelist裡面的target_link_libraries裡面的名字是對應的。新增四個方法分別在c/cpp裡面算加減並返回結果。
在c檔案當中新增如下程式碼:
這裡寫圖片描述
在cpp檔案當中新增如下程式碼:
這裡寫圖片描述
看出來區別沒,相差一個extern “C”,這個的作用網上很多就不說了。
其中:
這裡寫圖片描述
最後呼叫c、c++程式碼,在MainActivity裡面:
這裡寫圖片描述
最後檢查一下整個程式碼,包括三個地方,c/cpp當中,JniNative當中,MainActivity當中,都沒有問題就可以運行了。
執行結果,其中有分別在c檔案和cpp檔案當中的執行結果:
這裡寫圖片描述
總結:新增c當中的呼叫方法需要修改c,JniNative,MainActivity三個地方,要新增c/cpp檔案需要修改makelists檔案即可。