前言
近期项目要开始做鸿蒙版本,有一部分依赖native的代码也需要迁移,某个native模块依赖openssl,需要在鸿蒙下重新编译openssl才行。一开始找了很多相关文档都没有得到方法,无奈只能自己凭经验慢慢试,最后还是成功了。
鸿蒙NDK下载地址
https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#openharmony-release-notes
需要单独下载一份sdk,因为ide里面下载的sdk里面的ndk是不全的,缺少sysroot
如何编译
使用Cmake
上面的下载地址其实包含了编译三方库的教程,但是只有基于Cmake的方式,而且非常简陋,并没有提供一个真实的三方库编译教程,而实际开发中通常要复杂很多,需要编译的库往往有许多配置,还有一些子依赖,比较难以处理。另外有些库压根没有提供Cmake编译的方式,比如OpenSSL。如果库支持的话使用cmake编译相对简单一些,可以使用cmake-gui或者ide。
使用库提供的其他编译方式
大多数库都会提供一个配置脚本(./Configure)让使用者自定义进行编译,通常只需要配置好一些必要参数,必要工具的路径就可以比较轻松的完成,但是现在主流库肯定是没有鸿蒙支持的,所以需要自己额外配置的东西很多,接下来以编译OpenSSL为例。
先定义一个比较通用的配置脚本build_config.sh,方便以后编译其他库也能用,鸿蒙的编译器好像不像android那样需要区分api和架构,全都在llvm目录下,直接指定就可以了
另外还需要指定目标平台target、sysroot、cflags这些,我在文档里面没有找到,按照惯例找到了sdk里面的ohos.toolchain.cmake文件,参考这个文件服务器托管网进行了定义
比较麻烦的是编译openssl时需要指定的架构,openssl支持的架构配置在下图这些文件里面给了定义,但是没有鸿蒙的支持,那就只能选用linux的,linux-armv4、linux-aarch64这些。
build_config.sh
#NDK路径
export OHOS_NATIVE_HOME=/Users/admin/Downloads/ohos-sdk/darwin/native
export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
#cpu架构
if [ "$#" -lt 1 ]; then
THE_ARCH=armv7
else
THE_ARCH=$(tr [A-Z] [a-z]
接下来就比较简单了,再定义一个执行编译的脚本build_openssl.sh,可选的编译参数在configure文件里面,可以按需要配置
build_openssl.sh
#!/bin/bash
ARCH=$1
source build_config.sh $ARCH
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/openssl
PREFIX=$LIBS_DIR/$OHOS_ARCH
echo "PREFIX"=$PREFIX
export CC="$CC"
export CXX="$CXX"
export CXXFLAGS=$FF_EXTRA_CFLAGS
export CFLAGS=$FF_CFLAGS
export AR="$AR"
export LD="$LD"
export AS="$AS"
export NM="$NM"
export RANLIB="$RANLIB"
export STRIP="$STRIP"
export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
./Configure $OPENSSL_ARCH
--prefix=$PREFIX
no-e服务器托管网ngine
no-asm
no-threads
shared
make clean
make -j2
make install
cd ..
还有两个比较坑的点
- armv7架构下openssl依赖了libatomic,但是鸿蒙sdk里面没有提供这个库,所以我直接去改了openssl里面的配置,linux-armv4配置原本继承自linux-latomic,依赖了libatomic,直接改成继承linux-generic32,libatomic是一个多线程下保持原子性的库,所以需要加上no-threads禁用多线程。另外也可以自己去编译一个libatomic出来一起链接,这样就可以用多线程了。
- 默认配置编译出来的so库是带软链接,有so.x.y这种带版本号的命名,也需要在配置里面改一下
最后把脚本文件放到openssl目录下执行编译就可以了,也可以再写一个脚本方便一次性编译所有架构
for arch in armeabi-v7a arm64-v8a
do
bash build_openssl.sh $arch
done
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
在结构光三维重建中,通过相移法求解出来的相位是包裹相位(在 [-/2,/2] 间成周期性 ) 我们想要用相位找到相机与投影仪间的对应像素,就需要进行相位展开,确保每一行的相位值是唯一的。 多频外差是相位展开的一种,接下来我服务器托管网们会介绍它的原理,以及代码…