[14] CMAKEシリーズNDK詳細CMakeLists.txt詳細構成

1. CMakeのはじめに

CMakeのコンパイルは、対応するのMakefileやvcprojプロジェクトを生成するために、異なるプラットフォーム、異なるコンパイラに基づくことができ、作るよりも、より高度な設定ツールです。クロスプラットフォームの目的を達成するように。

Androidのメーカーは、CMakeの忍者を使用して生成され、忍者は小さな懸念がビルドシステムの速度です。私たちは、忍者のスクリプトを気にcmakeのにそれを設定する方法がわかりません。どのcmakeのを見ることができます実際には別のスクリプトのクロスプラットフォームサポートの出力を構築するためのさまざまなツールです。

アンドロイドスタジオ2.2以上では、ネイティブライブラリを構築するためのデフォルトのツールはcmakeのです。

2.基本コマンド

#cmake最低版本
cmake_minimum_required(VERSION 3.6.0)

#指定项目
project(Main)

add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库

検索C / cppのファイル

# 搜索当前目录下的所有.cpp文件, 但不能查找子目录
aux_source_directory(. SRC_LIST) 
add_library(demo ${SRC_LIST})

#也可以 
file(GLOB DIR_SRCS *.c)
add_executable(main ${DIR_SRCS})

サブディレクトリを使用しCMakeList

# 添加 child 子目录下的cmakelist
add_subdirectory(child)
# 指定生成目标 
add_library(main ${DIR_SRCS})
# 添加链接库
target_link_libraries(main child)
//--------------------------------------
# child中设置
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库 默认生成静态库
add_library (child ${DIR_LIB_SRCS})
#指定编译为静态库
add_library (child STATIC ${DIR_LIB_SRCS})

コンパイル済みのマクロを設定します

#设置预编译宏 cflag和cxxflag
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST"  )
set(CMAKE_Cxx_FLAGS "${CMAKE_Cxx_FLAGS} -DTEST"  )  

ヘッダファイルの導入

#这样就可以使用 #include <xx> 引入 
#否则需要使用 #include "path/xx" 
include_directories( imported-lib/include/ )

ロジック・ステートメントを分析

#逻辑判断 计较字符串
set(ANDROID_ABI "areambi-v7a")
if(${ANDROID_ABI} STREQUAL "areambi")
  	message("armv5")
elseif(${ANDROID_ABI} STREQUAL "areambi-v7a")
	message("armv7a")
else()
	
endif()

3. build.gradleの設定

//还可以在gradle中使用 arguments  设置一些配置
externalNativeBuild {
      cmake {
        arguments "-DANDROID_TOOLCHAIN=clang",	//使用的编译器clang/gcc
                  "-DANDROID_STL=gnustl_static" //cmake默认就是 gnustl_static
        cFlags "" //这里也可以指定cflag和cxxflag,效果和之前的cmakelist里使用一样
        cppFlags "" 
      }
    }	

4.注意事項

  1. Android.mk使用中> =あなたは6.0のデバイス上で(静的ライブラリは問題ありません)プリコンパイルされた動的ライブラリを使用することはできません。

    cmake_minimum_required(VERSION 3.4.1)
    
    file(GLOB SOURCE *.c )
    add_library(
                 hello-jni
                 SHARED
                ${SOURCE} )
                
    #这段配置在6.0依然没问题 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目录]")
    
    #这段配置只能在6.0以下使用 
    #add_library(Test SHARED IMPORTED)
    #set_target_properties(Test PROPERTIES IMPORTED_LOCATION [SO绝对地址])
    
    target_link_libraries(  hello-jni Test )
    
    1. 2つの動的ライブラリがあるlibhello-jni.soとはlibTest.so

      libhello-jni.so 依赖于libtest.so (使用NDK下的NDK-depends`)依存関係を表示するには、次のようになります。

      //<=5.0:
      	System.loadLibrary("Test");
      	System.loadLibrary("hello-jni");
      //>=6.0:
      	System.loadLibrary("hello-jni");
      

おすすめ

転載: blog.csdn.net/u011077027/article/details/93240811