如何将OpenSSL构建为未版本化的共享库(适用于Android)?
有很多,因为它是一个交叉编译。您应该从这里开始(它的OpenSSL wiki):OpenSSL and Android。
但是我尝试编译共享库。要做到这一点我运行:
的./configure Android的ARMv7的共享
好了,你缺少了一些东西。至少,你应该使用Android NDK。这是AOSP的要求。由于使用非NDK工具,这些年来我看到了一些小问题。
我相信你需要设置下列环境变量。这是一个OpenSSL要求。
86:
export MACHINE=i686
export RELEASE=2.6.37
export SYSTEM=android
export ARCH=x86
export CROSS_COMPILE="i686-linux-android-"
ARM:
export MACHINE=armv7
export RELEASE=2.6.37
export SYSTEM=android
export ARCH=arm
这两种:
export ANDROID_DEV="$ANDROID_NDK_ROOT/platforms/$_ANDROID_API/$_ANDROID_ARCH/usr"
export HOSTCC=gcc
ANDROID_DEV
将评估为类似/opt/android-ndk-r9/platforms/android-14/arch-arm/usr
。
您需要提供编译至少一个文件的输出。但我希望你缺少--sysroot
了。到--sysroot
的参数将会像/opt/android-ndk-r9/platforms/android-14/arch-arm
。
我会建议您按照OpenSSL and Android的说明。指示告诉你做的第一件事就是运行setenv-android.sh
设置适当的变量。
这里就是我的跑看起来像使用OpenSSL and Android。
$ cd openssl-1.0.1h
$ . ./setenv-android.sh
Error: FIPS_SIG does not specify incore module. Please edit this script.
ANDROID_NDK_ROOT: /opt/android-ndk-r9
ANDROID_EABI: arm-linux-androideabi-4.6
ANDROID_API: android-14
ANDROID_SYSROOT: /opt/android-ndk-r9/platforms/android-14/arch-arm
ANDROID_TOOLCHAIN: /opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin
FIPS_SIG:
CROSS_COMPILE: arm-linux-androideabi-
ANDROID_DEV: /opt/android-ndk-r9/platforms/android-14/arch-arm/usr
$ ./config shared no-ssl2 no-ssl3 no-comp no-engines no-hw no-psk no-srp
Operating system: armv7-whatever-android
Configuring for android-armv7
Configuring for android-armv7
no-comp [option] OPENSSL_NO_COMP (skip dir)
no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
no-engines [option] OPENSSL_NO_ENGINES (skip dir)
...
no-srp [option] OPENSSL_NO_SRP (skip dir)
no-ssl2 [option] OPENSSL_NO_SSL2 (skip dir)
no-ssl3 [option] OPENSSL_NO_SSL3 (skip dir)
no-store [experimental] OPENSSL_NO_STORE (skip dir)
no-zlib [default]
no-zlib-dynamic [default]
IsMK1MF=0
CC =gcc
...
$ make
...
arm-linux-androideabi-gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS
-D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -march=armv7-a -mandroid
-mfloat-abi=softfp -I/opt/android-ndk-r9/platforms/android-14/arch-arm/usr/include
-B/opt/android-ndk-r9/platforms/android-14/arch-arm/usr/lib -Os -fomit-frame-pointer
-Wall -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM
-DAES_ASM -DGHASH_ASM -c -o cryptlib.o cryptlib.c
...
可以忽略Error: FIPS_SIG does not specify incore module...
因为你不是 FIPS建立一个广阔的图书馆。
...无版本的共享库(Android版)?
这将会给你带来麻烦。我相信这样做的方式是提供各地的静态库的包装,并使用您的包装作为替代。所以,你从来不使用OpenSSL的共享对象,和版本没有关系。
的问题是你的过程将受精卵叉。受精卵已经映射到其空间的OpenSSL 0.9.8e。所以,当受精卵叉子你的过程,你的过程将已经0.9.8e和共享对象在你的APK 不会映射。您只需使用现有的OpenSSL。这将导致模糊的问题。
我也相信OpenSSL的Configure
有bug。首先,配置丢失-mfloat-abi=softfp
。这是AOSP的要求。其次,使用-O3
而不是-Os
。这是对资源受限设备的移动需求。
您可能想要打开Makefile
并在配置后进行更改。我在建图书馆之前也这样做。
来源
2014-06-13 19:07:01
jww
THX很多关于你的答案。我同意你关于OpenSSL的与共享库相关的配置错误的假设。当我找到时间时,我必须尝试。 – tmanthey