最后在使用NDK中使用libcurl,由于不同的安卓设备,版本不一样;使用so时,会导致报错dlopen时找不到某函数或出错。
最后直接使用libcurl.a后,目前在几款盒子上测试均能正常工作。
libcurl需要支持https得提前编译两个库:
openssl, zlib。
1. 编译openssl
下载openssl-3.3.1 的sourcecode
下载源地址:
openssl github下载地址https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gzam
解压后开始编译:
根目录有NOTES-ANDROID.md,里面有编译说明;如下:
export ANDROID_NDK_ROOT=/home/whoever/Android/android-sdk/ndk/20.0.5594570
PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
./Configure android-arm64 -D__ANDROID_API__=29
make
请将其中的目录修改为自己对应的目录。
编译时遇到问题:error: unknown argument: '-gcc-toolchain'.
问题原因,新版本的llvm不支持-gcc-toolchain参数
原编译参数:
-gcc-toolchain $(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64
修改为:
--gcc-toolchain=$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64
可以开始编译openssl了。
由于我使用的了libssl.a静态库,编译完成后使用,会出现
relocation R_ARM_REL32 cannot be used against symbol 'OPENSSL_armcap_P
解决方案:
重新使用下面命令config,去掉汇编。
./Configure android-arm -D__ANDROID_API__=18 no-asm no-shared --prefix=/home/deng/H3_Android/android_lib
编译后没有问题。
2. 编译libcurl.a
直接使用cmake:
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/home/deng/NDK/android-ndk-r25b/build/cmake/android.toolchain.cmake \
-DANDROID_NDK=$ANDROID_NDK_HOME \
-DANDROID_ABI=armeabi-v7a \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX==/home/deng/H3_Android/android_lib \
-DANDROID_PLATFORM=android-18 \
-DANDROID_TOOLCHAIN=clang \
-DCURL_DISABLE_LDAP=ON \
-DCURL_DISABLE_LDAPS=ON \
-DCURL_DISABLE_FILE=ON \
-DCURL_DISABLE_TELNET=ON \
-DCURL_DISABLE_DICT=ON \
-DCURL_DISABLE_TFTP=ON \
-DCURL_DISABLE_POP3=ON \
-DCURL_DISABLE_SMTP=ON \
-DCURL_DISABLE_IMAP=ON \
-DCURL_DISABLE_GOPHER=ON \
-DENABLE_MANUAL=OFF \
-DENABLE_UNIX_SOCKETS=OFF \
-DENABLE_IPV6=OFF \
-DBUILD_CURL_EXE=OFF \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_TESTING=OFF \
-DHTTP_ONLY=ON \
-DENABLE_THREAD=OFF \
-DENABLE_NTLM=OFF \
-DENABLE_NTLM_WB=OFF \
-DENABLE_SPNEGO=OFF \
-DENABLE_KERBEROS=OFF
CMake会遇到找不到openssl的问题,使用cmakegui将openssl对应的参数设置到刚才编译好后make install的位置。
可以开始编译了,注意如果编译64位需要在cmakegui里设置一下ANDOIRD_ABI为64位。
3. 编译zlib
下载源代码:
https://www.zlib.net/zlib-1.3.1.tar.gz
编译
直接使用CMake生成Makefile
cmake -DCMAKE_TOOLCHAIN_FILE=/home/deng/NDK/android-ndk-r25b/build/cmake/android.toolchain.cmake -DANDROID_NDK=$ANDROID_NDK_HOME -DANDROID_ABI=armeabi-v7a -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX==/home/deng/H3_Android/android_lib -DANDROID_PLATFORM=android-18 -DANDROID_TOOLCHAIN=clang
然后开始编译,基本没会遇到啥问题。
后面可以生成对应的几个库,libcurl.a libssl.a, libcrypto.a libz.a。
在应用程序中设置好参数,就可以支持https了。