文章目录
- 1、官网教程
- 2、编译NDK
- 2.1 下载ndk
- 2.2 编译环境准备
- 2.3 安装ndk
- 3 cmake交叉编译
- 3.1 编译工具链
- 3.2 编译三方库
- 4 自带编译配置文件的交叉编译
1、官网教程
AliOS开发官网链接:AliOS开发者官网
应用开发下NDK开发有相关NDK开发介绍
2、编译NDK
2.1 下载ndk
首先,下载ndk
2.2 编译环境准备
- 安装make
sudo apt install make
- 安装nodejs
sudo apt install nodejs
# 查看nodejs是否安装成功,查看版本
node -v
- 安装npm
sudo apt install npm
#查看npm是否安装成功,查看版本
npm -v
2.3 安装ndk
首先将ndk拷贝到服务器中,这里准备将ndk解压到aliNDK中
tar -zxvf alios-ivi-ndk-linux*.tar.gz -C ./aliDNK/
使用tar命令解压,并指定解压目录
解压后目录结构如图所示,然后执行安装
# 导入环境变量
export NDK_ROOT=/home/xy/code/aliosndk/
# 安装yndk
sudo npm install -g ./ali-yndk-build-2.9.8.tgz
# 测试yndk
yndk-build --help
# 安装make toolchain
npm install -g $NDK_ROOT/toolchains/ali-make_standalone_toolchain*.tgz
# 测试make toolchain
make_standalone_toolchain -h
3 cmake交叉编译
以expat三方库为例
3.1 编译工具链
首先创建交叉编译工具链
make_standalone_toolchain \--arch arm64 \--stl gnustdc++ \--api 5 \--install-dir aarch64-toolchain \--force
其中api可以指定为对应的api级别。也可以通过–install-dir指定安装目录
export TOOLCHAIN_ROOT=`pwd`/aarch64-toolchain
导出环境变量,该环境变量会在交叉编译时使用
3.2 编译三方库
下载expat源码expat
# 解压源码
tar -zxvf expat-2.5.0.tar.gz -C .
源码解压后,存在CMakeLists.txt,可以通过cmake编译
编写配置文件yunos_ndk_aarch64.cmake
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER $ENV{TOOLCHAIN_ROOT}/bin/aarch64-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN_ROOT}/bin/aarch64-linux-gnueabi-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH $ENV{TOOLCHAIN_ROOT}/sysroot)
# never search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# set rpath after run `make all install`
SET(CMAKE_INSTALL_RPATH $ORIGIN)
这里的TOOLCHAIN_ROOT是上面导出的环境变量,指向了编译后的ndk路径
CMAKE_FIND_ROOT_PATH指示,编译依赖文件的根路径,可以设置成默认的。如果自己设置了sysroot,可以在这里面添加
配置文件完成之后可以执行文件编译。目前在代码根目录
mkdir out && cd out
cmake -DCMAKE_TOOLCHAIN_FILE=../yunos_ndk_aarch64.cmake -DCMAKE_INSTALL_PREFIX=./install ../
make && make install
CMAKE_INSTALL_PREFIX环境变量定义cmake执行make install命令时的安装路径。目前就是安装在out/install目录下的
编译后的文件如下:
包含可执行文件,动态库和头文件等
4 自带编译配置文件的交叉编译
这里以openssl为例
下载源码并解压
tar -zxvf openssl-3.2.0.tar.gz -C ./
修改crypto/getenv.c源码
char *ossl_safe_getenv(const char *name)
{
#ifndef YUNOS_NDK // 当 YUNOS_NDK 有定义时,跳过 secure_getenv的使用#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)# if __GLIBC_PREREQ(2, 17)# define SECURE_GETENVreturn secure_getenv(name);# endif#endif
#endif // end of #ifndef YUNOS_NDK
#ifndef SECURE_GETENVif (OPENSSL_issetugid())return NULL;return getenv(name);
#endif
}
原因是 NDK glibc 并不支持 secure_getenv 这类 GNU 扩展的 API。所以需要在代码中避免使用这类 API。如果版本有差异,则只需要修改secure_getenv调用部分代码就可以
然后执行编译
TOOL=aarch64-linux-gnueabi && CFLAGS="-fPIC -DYUNOS_NDK"
mkdir out && cd out
../Configure no-async linux-aarch64 shared --prefix=./install --openssldir=$INSTALL_DIR/openssl --cross-compile-prefix=${TOOLCHAIN_ROOT}/bin/${TOOL}- ${CFLAGS}
make && make install
执行完成之后,在out/install目录下生成相应文件