使用NDK编译OpenSSL与curl

使用NDK编译OpenSSL与curl

0. 编译环境

1. 声明编译环境

新建编译环境相关变量设置脚本,并执行该脚本:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ cat envsetup.sh 
#!/bin/sh

#adjust the following two line definition to your develop environment
NDK_ROOT=/home/hyj/workspace/android-ndk-r12b
HOST_PLATFORM=linux-x86_64
TARGET_PLATFORM=ARM_V3S

#below lines always keep not changed 
PROJECT_ROOT=$(pwd)
INSTALL_ROOT=${PROJECT_ROOT}/output

SYSROOT=${NDK_ROOT}/platforms/android-21/arch-arm64
CROSS_TOOLCHAIN=${NDK_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/${HOST_PLATFORM}/bin/aarch64-linux-android-
CONFIGURE_PARAMETERS="--with-sysroot={SYSROOT} --host=arm-linux --prefix=${LIBRARY_INSTALL_PATH}"
CFLAGS="-D$TARGET_PLATFORM --sysroot=${SYSROOT} \
       -Wformat -Werror=format-security -fexceptions -Os -fno-omit-frame-pointer -ggdb3 \
       -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -Os -g -DNDEBUG  \
       -fno-strict-aliasing -finline-limit=64 -O3 -I${SYSROOT}/usr/include \
       -I${NDK_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/include -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/include \
       -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/"
LDFLAGS="-lgcc ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a \
         -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now \
         -L${NDK_ROOT}/platforms/android-21/arch-arm64/usr/lib  \
         ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libsupc++.a -lc -lm \
          --sysroot=${NDK_ROOT}/platforms/android-21/arch-arm64"

mkdir -p $INSTALL_ROOT
CC=${CROSS_TOOLCHAIN}gcc
CPP="${CROSS_TOOLCHAIN}cpp --sysroot=${SYSROOT}"
CXX=${CROSS_TOOLCHAIN}g++
CXXCPP="${CROSS_TOOLCHAIN}cpp  --sysroot=${SYSROOT}"
RANLIB=${CROSS_TOOLCHAIN}ranlib
LD=${CROSS_TOOLCHAIN}ld
AR=${CROSS_TOOLCHAIN}ar
STRIP=${CROSS_TOOLCHAIN}strip

PROJECT_ROOT=${PROJECT_ROOT} \
INSTALL_ROOT=${INSTALL_ROOT} \
SYSROOT=${SYSROOT} \
CFLAGS=${CFLAGS} \
LDFLAGS=${LDFLAGS} \
CONFIGURE_PARAMETERS=${CONFIGURE_PARAMETERS} \
CROSS_TOOLCHAIN=${CROSS_TOOLCHAIN} \
CC=${CC} \
CPP=${CPP} \
CXX=${CXX} \
CXXCPP=${CXXCPP} \
LD=${LD} \
RANLIB=${RANLIB} \
AR=${AR} \
STRIP=${STRIP} \
 bash 
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ ./envsetup.sh 
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ 

将编译链与相关源码下载并解压到本地之后,工程目录下的内容如下:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b$ tree -L 1
.
├── curl-7.76.0
├── curl-7.76.0.tar.bz2
├── envsetup.sh
├── openssl-1.1.0i
├── openssl-1.1.0i.tar.gz
└── output

3 directories, 3 files

2. 编译OpenSSL

进入OpenSSL目录,执行工程配置命令:

cd openssl-1.1.0i
./config --prefix=${INSTALL_ROOT}/openssl no-asm no-threads -shared  --sysroot=${SYSROOT}

编辑openssl-1.1.0i/Makefile,删除该文件中所有的"-m64"选项,并进行编译与安装相关文件:

make -j8
make install
${CROSS_TOOLCHAIN}strip ${INSTALL_ROOT}/openssl/lib/*.so*

进入output目录,能够看到适用于ARM x64架构的OpenSSL的相关文件已经生成:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ tree -L 3
.
└── openssl
    ├── bin
    │   ├── c_rehash
    │   └── openssl
    ├── include
    │   └── openssl
    ├── lib
    │   ├── engines-1.1
    │   ├── libcrypto.a
    │   ├── libcrypto.so -> libcrypto.so.1.1
    │   ├── libcrypto.so.1.1
    │   ├── libssl.a
    │   ├── libssl.so -> libssl.so.1.1
    │   ├── libssl.so.1.1
    │   └── pkgconfig
    ├── share
    │   ├── doc
    │   └── man
    └── ssl
        ├── certs
        ├── misc
        ├── openssl.cnf
        ├── openssl.cnf.dist
        └── private

14 directories, 10 files
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ file openssl/lib/*
openssl/lib/engines-1.1:      directory
openssl/lib/libcrypto.a:      current ar archive
openssl/lib/libcrypto.so:     symbolic link to libcrypto.so.1.1
openssl/lib/libcrypto.so.1.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
openssl/lib/libssl.a:         current ar archive
openssl/lib/libssl.so:        symbolic link to libssl.so.1.1
openssl/lib/libssl.so.1.1:    ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
openssl/lib/pkgconfig:        directory

3. 编译curl

进入curl源码目录,执行工程配置命令,并进行编译与安装:

./configure --with-sysroot=${SYSROOT} --host=arm-linux --prefix=${INSTALL_ROOT}/curl --with-ssl=${INSTALL_ROOT}/openssl --disable-all  --enable-shared --enable-static --without-libidn --without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps --disable-ipv6
make clean
make -j8
make install
${CROSS_TOOLCHAIN}strip ${INSTALL_ROOT}/curl/lib/*.so*

进入output目录,能够看到适用于ARM x64架构的curl的相关文件已经生成:

hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ tree -L 3
.
├── curl
│   ├── bin
│   │   ├── curl
│   │   └── curl-config
│   ├── include
│   │   └── curl
│   ├── lib
│   │   ├── libcurl.a
│   │   ├── libcurl.la
│   │   ├── libcurl.so -> libcurl.so.4.7.0
│   │   ├── libcurl.so.4 -> libcurl.so.4.7.0
│   │   ├── libcurl.so.4.7.0
│   │   └── pkgconfig
│   └── share
│       ├── aclocal
│       └── man
└── openssl
    ├── bin
    │   ├── c_rehash
    │   └── openssl
    ├── include
    │   └── openssl
    ├── lib
    │   ├── engines-1.1
    │   ├── libcrypto.a
    │   ├── libcrypto.so -> libcrypto.so.1.1
    │   ├── libcrypto.so.1.1
    │   ├── libssl.a
    │   ├── libssl.so -> libssl.so.1.1
    │   ├── libssl.so.1.1
    │   └── pkgconfig
    ├── share
    │   ├── doc
    │   └── man
    └── ssl
        ├── certs
        ├── misc
        ├── openssl.cnf
        ├── openssl.cnf.dist
        └── private

23 directories, 17 files
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ file openssl/lib/*.so*
openssl/lib/libcrypto.so:     symbolic link to libcrypto.so.1.1
openssl/lib/libcrypto.so.1.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
openssl/lib/libssl.so:        symbolic link to libssl.so.1.1
openssl/lib/libssl.so.1.1:    ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped
hyj@hyj-ubuntu:~/workspace/curl_x64_r12b/output$ 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用NDK编译OpenSSL的方法如下: 1. 下载OpenSSL源代码和NDK。 2. 将OpenSSL源代码解压到一个目录下,比如 `~/openssl-1.1.1g`。 3. 在 `~/openssl-1.1.1g` 目录下创建一个名为 `Application.mk` 的文件,文件内容如下: ``` APP_ABI := armeabi-v7a APP_PLATFORM := android-21 ``` 其中 `APP_ABI` 表示编译的目标平台,这里选择 `armeabi-v7a`;`APP_PLATFORM` 表示使用Android版本,这里选择 `android-21`。 4. 在 `~/openssl-1.1.1g` 目录下创建一个名为 `Android.mk` 的文件,文件内容如下: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := openssl LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/crypto/*.c) LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/ssl/*.c) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_CFLAGS := -DOPENSSL_NO_ASM -DOPENSSL_ANDROID LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) include $(BUILD_SHARED_LIBRARY) ``` 其中 `LOCAL_MODULE` 表示生成的库文件名,这里设为 `openssl`;`LOCAL_SRC_FILES` 表示需要编译的源文件;`LOCAL_C_INCLUDES` 表示头文件路径;`LOCAL_CFLAGS` 表示编译选项,这里禁用汇编和启用Android特有的宏定义;`LOCAL_LDLIBS` 表示链接库,这里链接 `liblog.so`。 5. 在终端中进入 `~/openssl-1.1.1g` 目录,执行以下命令: ``` $ export NDK_HOME=/path/to/ndk $ $NDK_HOME/ndk-build ``` 其中 `/path/to/ndk` 是NDK的安装路径。执行完毕后,在 `~/openssl-1.1.1g/libs/armeabi-v7a` 目录下会生成 `libopenssl.so` 文件。 6. 将 `libopenssl.so` 文件复制到Android工程的 `libs/armeabi-v7a` 目录下。 7. 在Android工程的 `build.gradle` 文件中添加以下代码: ``` android { // ... sourceSets { main { jniLibs.srcDirs = ['libs'] } } } ``` 这样就可以在应用中使用OpenSSL库了。 注意:在使用OpenSSL时,需要在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值