背景
最近有一个Linux下的C语言实现的文件操作库需要移植到Android上,而嵌入式的同事直接扔了一堆源码给到我,我一脸懵逼的同时也只能硬着头皮上了
一般我们可以通过在项目中导入C/C++代码,使用AS中的cmake文件编译成so库,但是我这个库里的代码使用在ndk中的stdio库中的文件操作方法总是报错或者编译不通过,于是只能选择在Linux下直接使用ndk编译成so库了
啰嗦的前言说完,开始
一、配置环境
- 下载NDK
- 解压
- 添加环境变量
命令行运行
#vim /etc/profile
在文件末尾添加如下内容:
export ANDROID_NDK=“解压的ndk路径”
export PATH=ANDROID_NDK:$PATH
保存退出,更新一下环境变量
source ~/.bashrc
命令行输入命令 ndk-build
出现以下字符表示配置成功
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
二、创建Android.mk、Application.mk,直接编译
此时找到你的C/C++项目下的源码位置,新建Android.mk
和Application.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)
- Application.mk
//生成4个全部架构的库
APP_ABI := all
//适应Android版本,如果不对这里会报错,可以根据报错更改
APP_PLATFORM := android-16
一般来说,此时在当前目录下运行ndk-build
,就会生成libs
和obj
目录,其中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}
命令行运行./build.sh
,此时同样会生成libs
和obj
目录,其中libs目录里就是我们可以直接在Android里调用的so库了