Cmake

# 版本
cmake_minimum_required(VERSION 3.4.1)
# 添加库 和 源文件
add_library(
        # 最终生成的名字 lib + native-lib .so
        native-lib
        # 明确指定是动态库
        SHARED
        # 很多的源文件  或者有一次添加所有源文件
        native-lib.cpp
)
# 变量指定 引用库
find_library(
        log-lib
        # 这个是变量名 和下面的 ${log-lib} 用的是一个变量,用的是log库
        # /android-ndk-r17c/platforms/android-28/arch-arm/usr/lib
        # 下面的log是什么意思 liblog.so == log
        log)
# 引入头文件等一些库
target_link_libraries(
        native-lib  
        ${log-lib}) # 这个log-lib 就是上面的库位置

添加静态动态库

步骤
1、加入静/动态库
2、导入静/动态库
3、引用静/动态库
注意
1、so动态库的加入,默认需要在和java同级别的目录下,创建jniLibs目录,下面再是x86/armeabi-v7a 目录 ,再下来是so文件。
2、动态库加入后,直接运行,第一次会报错,因为System.loadLibrary是总的so,如果so中还加入别的so,需要再总的前面先进行

static {
        System.loadLibrary("get");   // 先引用so中引用的so 要么会找不到这个so
        System.loadLibrary("native-lib"); // 总的so
    }
cmake_minimum_required(VERSION 3.4.1)

# 添加库 和 源文件
add_library(
        native-lib
        SHARED
        native-lib.cpp)    # 加入源文件,不需要加h 文件  加了就出错
# 批量引入圆文件
file(GLOB allCpp *.cpp)
##1、加入入静态库
#add_library(
#        get
#        STATIC IMPORTED
#)
## 2、导入静态库
#set_target_properties(
#        get PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libget.a
#)
# 1、加入动态库
add_library(
        get
        SHARED IMPORTED
)
# 2、导入动态库
set_target_properties(
        get
        PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libget.so
)

# 变量指定 引用的库,下面引用库的时候,直接引用变量
find_library(
        log-lib
        log)

# 3、引用
target_link_libraries( # Specifies the target library.
        native-lib
        get
        ${log-lib})   # 这个log库,是根据gradle 最小版本来定,最小版本多少,他就是多少的库

C/C++ 交叉运行

如果so是用C写的,在引用的时候,就不能直接引用,需要

// 因为是c写的.a 现在是c++调用,会有问题
//extern int get();
extern "C" {
    int get();
}
// 这样在C++代码中,才能直接get so中的方法

Gradle

 externalNativeBuild {
            cmake {
//                cppFlags "" 打包默认包含4大平台
                abiFilters 'x86'  //指定使用什么平台 编译
            }
        }

动态库规定放在main 下的jniLibs

你可能感兴趣的:(Cmake)