NDK16_现有项目集成CMake

NDK开发汇总
已经存在的项目,怎样才能改成Cmake的形式集成NDK呢?

一 修改Build.gradle

android {
    
    
    compileSdkVersion 29
    defaultConfig {
    
    
        ...
        // 指导我们的 源文件 编译
        externalNativeBuild{
    
    
//            ndkBuild{
    
    
//
//                // armeabi-v7a
//                abiFilters 'armeabi-v7a'
//
//            }
            cmake{
    
    
                abiFilters 'armeabi-v7a'
            }
        }


        // 应该打包几种cpu
        //比如: 集成了第三方库 ,第三方库中提供了 arm的 提供了 x86的
        // 可以在此处 指导 只打包 arm
        // 生成出来的apk 就只会包含 arm的
        ndk{
    
    
            abiFilters 'armeabi-v7a'
        }
    }



    externalNativeBuild{
    
    

//        ndkBuild{
    
    
//            path   "src/main/cpp/Android.mk"
//        }
        cmake{
    
    
            path   "CMakeLists.txt"
        }

    }
   ...
}

二 配置资源

  • src路径下新建cmake文件夹,将项目用到的.c /cpp,.a静态库和.so动态库添加进去
  • app目录下新建CMakeLists.txt文件
 #指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)

# hello-jni 变量名 最终会生成的so名称
# SHARED 动态库 STATIC静态库
add_library(hello-jni SHARED src/main/cmake/native-lib.c)

二 常见语法

  • 指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)
  • 引入目录下所有的c文件和C++文件
file(GLOB source src/main/cmake/*.c src/main/cmake/*.cpp)
add_library(hello-jni SHARED ${source})

四 静态库引入

注意: 为了对比效果,本文用的.a和.so库是同一个c文件编译而成,集成的时候是或者关系(一、二、四或者一、二、五),实际运用时不同类型(静态和动态)库并行引入

add_library(Test STATIC IMPORTED)
set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${
    
    CMAKE_SOURCE_DIR}/src/main/cmake/${
    
    ANDROID_ABI}/libTest.a)
target_link_libraries(hello-jni Test)

完整配置

 #指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)

# hello-jni 变量名 最终会生成的so名称
# SHARED 动态库 STATIC静态库
add_library(hello-jni SHARED src/main/cmake/native-lib.c)

# IMPORTED 表示我们这一个静态库是以导入的形式添加进来(预编译静态库)
add_library(Test STATIC IMPORTED)
# 设置导入的路径
# 设置目标属性方法
# 设置Test的导入路径属性
# CMAKE_SOURCE_DIR 当前CMakeLists.txt的路径(cmake工具内置的)
#android cmake内置的ANDROID_ABI
message("ANDROID_ABI:${ANDROID_ABI}")
set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${
    
    CMAKE_SOURCE_DIR}/src/main/cmake/${
    
    ANDROID_ABI}/libTest.a)

# 链接(不能换位置)
# 要生成的目标so在前
# 编译hello-jni模块 需要链接(依赖)Test模块
target_link_libraries(hello-jni Test)

五 动态库引入

#指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)

# hello-jni 变量名 最终会生成的so名称
# SHARED 动态库 STATIC静态库
file(GLOB source src/main/cmake/*.c src/main/cmake/*.cpp)
add_library(hello-jni SHARED ${source})
#  6.0以上会报错
#add_library(Test2 SHARED IMPORTED)
#set_target_properties(Test2 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libTest.so)

# 和makefile不同cmake有其他方法引入动态库
# C++:CMAKE_CXX_FLAGS
# set方法 定义一个变量
#-L:库的查找路径 libTest.so
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}")
# 链接(不能换位置)
# 要生成的目标so在前
# 编译hello-jni模块 需要链接(依赖)Test模块(libTest.so)

target_link_libraries(hello-jni Test log)


#find_library(log-lib log)
#message("log-lib:${log-lib}")
#target_link_libraries(hello-jni Test2 ${log-lib})

猜你喜欢

转载自blog.csdn.net/baopengjian/article/details/107681032