Android NDK Cmake学习记录

一个普通的Android 项目变成支持NDK的项目需要一些配置
首先在app.gradle中需要增加一些cmake的设置,如下

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "com.pbph.normaltondkdemo"
        minSdkVersion 19
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk {
            //打包时候需要生成的支持CPU架构
            abiFilters "armeabi-v7a"
        }
        externalNativeBuild{
            cmake{
                //编译时候指定cpu架构
                abiFilters 'armeabi-v7a'
            }
        }
    }
    //cMake  -> ninjjia->生成so
    externalNativeBuild{
        cmake{
        //在当前app目录下
            path "CMakeLists.txt"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

比如我们有一个jni的c++文件

#include 
#include 

extern "C"{
extern int test();
}



extern "C"
 void Java_com_pbph_normaltondkdemo_MainActivity_nativeTest(JNIEnv *env,jobject object){

    test();
}

,并且此文件需要依赖一个so库,在CMakeLists.txt 文件中(代码中已详细注释),注释部分包含如果引入的是静态库,也就是.a文件,应当如何添加

#cmake  版本
cmake_minimum_required(VERSION 3.6)
#引入include 文件  在使用的时候就可以在引入的时候不使用include相对路径,直接include 使用的的头文件即可
include_directories(src/main/cmake/include)
#定义全局的变量  csource 表示cmake目录下的所有c cpp 文件全部添加进去
file(GLOB csource src/main/cmake/*.cpp src/main/cmake/*.c)
# hello-jni 最终生成的so的名字(自定义名字没有要求)  SHARED 动态库   文件路径
add_library(hello-jni SHARED src/main/cmake/hello-jni.cpp)
#add_library(hello-jni SHARED ${csource})
#引入静态库IMPORTED表示我们这一个静态库以导入的形式添加进来 预编译静态库
# Android abi  这是我们设置的armeabi-v7a
#add_library(Test STATIC IMPORTED )
##设置目标属性方法 设置一个导入路径在当前目录下
#set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/cmake/${ANDROID_ABI}/libTest.a)
# 引入动态库的方法 set定义一个变量  由于我们使用c++   CMAKE_CXX_FLAGS
#如果使用C编写的话那就是CMAKE_C_FLAGS
#-L 库的查找路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}")

# 会去NDK的库中去找  也可以直接在target_link_libraries 中直接写上log
find_library(log-lib log)

# 链接
#  1 要生成的目标so  不能更改顺序
target_link_libraries(hello-jni Test ${log-lib})

编译运行以后,我们点击build下的Analazy Apk… 就能看到lib目录下生成了libhello-jni.so
如图
Android NDK Cmake学习记录_第1张图片

你可能感兴趣的:(android,音视频学习)