2017年7月14日金曜日

[安藤]android studio 2.3 with JNI(使用CMake做為編譯工具)

原來android studio 2.2之後就可以不用靠gradle-experimantal來支援native api,
於是趕快來試看看。畢竟gradle-experimantal用起來總是毛毛的。

前置準備:
  • 使用sdk manager安裝cmake。(選擇「sdk tools的tab就可以看到」)
然後在main project的build.gradle裡面增加下面紅色的部分:

android {

    compileSdkVersion 24    buildToolsVersion "25.0.2"    defaultConfig {
    ...
    }

    productFlavors {
    ...
    }

    externalNativeBuild {
        cmake {
            path 'src/main/cpp/CMakeLists.txt'        }
    }
}
 
要注意的是CMakeLists.txt的路徑。上面的例子是放在[main project]/main/cpp 裡面。
(cpp目錄不存在的話請自行新增) 
當然也可以放在其他地方。最建議的位置是[main project]的根目錄。
另外,同一個module的CMakeLists.txt只能有一個。要含入其他的navive c 的lib的話都要寫在這個唯一的檔案裡面。

再建立一個JNIClass.cpp(檔名隨意),放在路徑[main project]/main/cpp。


CMakeLists.txt的內容:
 
# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             app  # build出來的lib的名稱。
             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             JNIClass.cpp  #所有c/c++檔案的列表。此例的c檔案跟CMakeLists.txt放在同一個目錄,所以可以不指定檔案路徑。若是不同路徑的話請自行指定。
)

# log
find_library(log-lib log)  # 有要include各種android os系統內建lib的話可以用這方法找。請注意對應的顏色。
target_link_libraries(app ${log-lib} android)  # 需要include的各種lib。似乎是要包含自己。
# Specifies a path to native header files.
# include_directories(src/main/cpp/) # 要增加其他的原始碼所在目錄的話可以用此法。



之後重新sync project再run /debug project應該就可以了。