AliOS开发官网链接:AliOS开发者官网
应用开发下NDK开发有相关NDK开发介绍
sudo apt install make
sudo apt install nodejs
# 查看nodejs是否安装成功,查看版本
node -v
sudo apt install npm
#查看npm是否安装成功,查看版本
npm -v
首先将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
以expat三方库为例
首先创建交叉编译工具链
make_standalone_toolchain \
--arch arm64 \
--stl gnustdc++ \
--api 5 \
--install-dir aarch64-toolchain \
--force
其中api可以指定为对应的api级别。也可以通过–install-dir指定安装目录
export TOOLCHAIN_ROOT=`pwd`/aarch64-toolchain
导出环境变量,该环境变量会在交叉编译时使用
下载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目录下的
编译后的文件如下:
包含可执行文件,动态库和头文件等
这里以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_GETENV
return secure_getenv(name);
# endif
#endif
#endif // end of #ifndef YUNOS_NDK
#ifndef SECURE_GETENV
if (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