Android C++编程之CMakeLists的应用

Android C++编程之CMakeLists的应用

简介

   以前用eclipse编写android项目,一般应用的都是Android.mk文件去编写c代码的配置和生成.so的操作,现在Android studio推出了cMakeLists.txt文件去编写,刚开始应用比较麻烦,如果熟悉了,感觉也简单了。

 

1.如果应用CMakeLists,新建项目时,就要在android studio去勾选include c++ support

然后一路next

 

2. 选中C++建立的项目,项目目录会多加几个文件

cpp文件夹就是你的c代码存放的位置

CMakeLists.txt就是你对C环境配置的位置,类似Android.mk

 

3.build中会多出一些配置


android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.wzw.myapplication"
        
minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        
externalNativeBuild {
            cmake {
                cppFlags ""
            
}
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
}
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        
}
    }
}

 

其中在 cmake {
                cppFlags ""
            
}
可以配置cppFlagscppFalgs -std=c++11 -frtti -fexceptions

这是指定用c++11进行编程,同时还要再CMakeList文件中配置应用c++11

 

还可以在cmake{}中添加abiFilters armeabi

这是指定生成哪几种 so

 

 

sourceSets{
    main{
        jniLibs.srcDirs = ['H:\\SafetyProject\\Serpurity\\app\\alley\\lib']
    }
}

添加以上代码,是为了添加你的外部so库路径。

以上就是build的基本配置,当然还有很多其他配置,但是我用这些就够了

 

4. CMakeList文件

cmake_minimum_required(VERSION 3.4.1)

这是cMake的版本信息

#C++编译
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

 

这是添加c++11

#配置加载头文件
include_directories(H:/SafetyProject/Serpurity/app/alley/include)

这是配置头文件的路径,在APP文件夹中创建一个alley文件夹,这个文件夹中有一个libinclude文件夹

lib是你引入的第三方so库,include是你引入的.h文件

 

 

 

#动态方式加载
add_library(openssl SHARED IMPORTED )


#引入第三方.so
set_target_properties(openssl PROPERTIES IMPORTED_LOCATION H:/SafetyProject/Serpurity/app/alley/lib/${ANDROID_ABI}/libcrypto.so)

 

这是添加你在alley中的so库,有多个则要添加多个so

 


add_library( # Sets the name of the library.
             signature
             SHARED
             src/main/cpp/signature.cpp
             src/main/cpp/HTTPTools.cpp
             )

这只你自己编写的cpp文件,如果在cpp文件夹中有多个.cpp文件,则添加多个(子目录不算)  src/main/cpp/HTTPTools.cpp

 

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

 

这个默认即可

target_link_libraries( # Specifies the target library.
                        signature
                        openssl
                        android
                       # included in the NDK.
                       ${log-lib}
                       z)

 

这是关联你导入的so库,openssl是你上边导入的soandroid是原生jni的不用导入,z也是原生的zlib库,只要在这里添加,不需要在上边导入

 

 

 

 

 

5. 子目录中的c代码

我们看到,在cpp文件夹中,有Third文件夹,在这个文件夹中的c文件,并不能在此CMakeList中进型配置,而是要子再子文件夹中新建一个CmakeLists文件

 

不管有几层子目录,都在有c代码中的子文件目录下添加CMakelists文件,如果多个子文件,则添加多个

cmake_minimum_required(VERSION 3.4.1)
#配置加载头文件
add_library(common
            SHARED
            dictionary.c )
find_library(log-lib log)
target_link_libraries(common
                        ${log-lib}
                        )

 

common中的配置没有什么不同的

 

cmake_minimum_required(VERSION 3.4.1)
add_library(dec
            SHARED
            bit_reader.c
            decode.c
            huffman.c
            state.c)
find_library(log-lib log)
target_link_libraries(dec
                      common
                       ${log-lib}
                        )

 

dec中,因为用到了common中的代码,所以在target_link_libraries(dec
                                                                common
                                                               ${log-lib}
                                                                 )

中要添加common。因为子目录添加cmake文件,就是把子目录代码打包成so库,所以这里添加也类似导入so

 

最后,在项目的CMakesLists中添加

ADD_SUBDIRECTORY(src/main/cpp/Third/brotli/common)
ADD_SUBDIRECTORY(src/main/cpp/Third/brotli/dec)

把你子目录的so和项目cmake关联,ok。

其他jni的编写方法,我就不多说了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值