• Android NDK 在Linux下使用mk文件生成SO库


    背景

    最近有一个Linux下的C语言实现的文件操作库需要移植到Android上,而嵌入式的同事直接扔了一堆源码给到我,我一脸懵逼的同时也只能硬着头皮上了

    一般我们可以通过在项目中导入C/C++代码,使用AS中的cmake文件编译成so库,但是我这个库里的代码使用在ndk中的stdio库中的文件操作方法总是报错或者编译不通过,于是只能选择在Linux下直接使用ndk编译成so库了

    啰嗦的前言说完,开始

    一、配置环境

    1. 下载NDK

    NDK下载地址:https://developer.android.google.cn/ndk/downloads/

    1. 解压
    2. 添加环境变量

    命令行运行

    #vim /etc/profile
    
    • 1

    在文件末尾添加如下内容:

    export ANDROID_NDK=“解压的ndk路径”
    export PATH=ANDROID_NDK:$PATH
    
    • 1
    • 2

    保存退出,更新一下环境变量

    source ~/.bashrc
    
    • 1

    命令行输入命令 ndk-build出现以下字符表示配置成功

    Android NDK: Could not find application project directory !    
    Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
    
    • 1
    • 2

    二、创建Android.mk、Application.mk,直接编译

    此时找到你的C/C++项目下的源码位置,新建Android.mkApplication.mk两个文件

    • Android.mk:
    //my-dir宏返回Android.mk所在位置 即将LOCAL_PATH赋值
    LOCAL_PATH:=$(call my-dir)
    //清理LOCAL_XXX变量的值
    include $(CLEAR_VARS)
    //模块名字
    LOCAL_MODULE := nativeC
    //打包给模块的C/C++源码 头文件不用列出 此源文件可以用具体路径表示 用\分隔
    LOCAL_SRC_FILES:= xxxx.c \
    aaaa.c \
    bbbb.c
    //编译输出 STATIC为静态库 SHARED为动态库 BUILD_EXECUTABLE为可执行程序
    include $(BUILD_SHARED_LIBRARY)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • Application.mk
    //生成4个全部架构的库
    APP_ABI := all
    //适应Android版本,如果不对这里会报错,可以根据报错更改
    APP_PLATFORM := android-16
    
    • 1
    • 2
    • 3
    • 4

    一般来说,此时在当前目录下运行ndk-build,就会生成libsobj目录,其中libs目录里就是我们可以直接在Android里调用的so库了

    如果过程中因为环境变量、JNI路径之类的有问题,我们也可以直接使用脚本文件指定目录

    三、使用build.sh脚本编译

    继续在当前目录创建build.sh文件,写入

    #!/bin/bash
    //代码目录,替换为你的目录
    PATH=/home/andyxdz/project/lib
    //ndk目录,替换为你解压后的ndk目录
    NDK=/home/andyxdz/android-ndk-r18b
    BUILDER=${NDK}/ndk-build
    ABS=${PATH}/Android.mk
    NAM=${PATH}/Application.mk
    
    ${BUILDER} NDK_PROJECT_PATH=${PATH} APP_BUILD_SCRIPT=${ABS} NDK_APPLICATION_MK=${NAM}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    命令行运行./build.sh ,此时同样会生成libsobj目录,其中libs目录里就是我们可以直接在Android里调用的so库了

  • 相关阅读:
    请求和响应
    MCU(单片机)datasheet(规格说明书)
    Linux驱动开发 --- 架构方面的一些感悟
    数据结构之图(有向无环图结构表达式)
    图神经网络(六):GAT
    ssm学生成绩管理
    小程序中使用echarts地图
    C Primer Plus(6) 中文版 第1章 初识C语言 1.8 编程机制 1.11 本章小结
    springmvc、springBoot---第三篇
    LeetCode //C - 212. Word Search II
  • 原文地址:https://blog.csdn.net/weixin_40303382/article/details/126540835