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 <jni.h>
#include <android/log.h>

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
如图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值