Android QT+;OpenSSL+;安卓

Android QT+;OpenSSL+;安卓,android,c++,qt,openssl,Android,C++,Qt,Openssl,我想设置OpenSSL库。对于我的Qt项目。在Linux下,内置的OpenSSL可以很好地工作。我在.pro文件中添加了以下内容: LIBS+=-lcrypto PKGCONFIG += openssl # FORMS, SOURCES, TARGET, etc... unix:!macx: LIBS += -L$$PWD/../SSL/openssl-0.9.8za/ -lcrypto INCLUDEPATH += $$PWD/../SSL/openssl-0.9.8za/include

我想设置OpenSSL库。对于我的Qt项目。在Linux下,内置的OpenSSL可以很好地工作。我在.pro文件中添加了以下内容:

LIBS+=-lcrypto
PKGCONFIG += openssl
# FORMS, SOURCES, TARGET, etc...

unix:!macx: LIBS += -L$$PWD/../SSL/openssl-0.9.8za/ -lcrypto

INCLUDEPATH += $$PWD/../SSL/openssl-0.9.8za/include
DEPENDPATH += $$PWD/../SSL/openssl-0.9.8za/include

unix:!macx: PRE_TARGETDEPS += $$PWD/../SSL/openssl-0.9.8za/libcrypto.a
但如果我在安卓系统中使用它,就会产生错误。我遵照指示:

$ . ./setenv-android.sh
$ cd openssl-1.0.1h/
$ perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org
$ ./config shared -no-ssl2 -no-ssl3 -no-comp -no-hw -no-engine --openssldir=/usr/local/ssl/$ANDROID_API
$ make depend
$ ./Configure shared android-armv7
$ make build_libs
$ export CC=/home/laci/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
$ export AR=/home/laci/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
$ export ANDROID_DEV=/home/laci/android-ndk-r10/platforms/android-14/arch-arm/usr/
$ make all
$ sudo -E make install CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib
这些网站是我的资料来源:

我做错了什么

提前感谢您的回答

LIBS+=-lcrypto

我看到了两个潜在的问题。首先,您可能需要
LIBS+=-lssl-lcrypto

其次,QT可能使用主机的OpenSSL(即,
/usr/lib
中的i386或x86_64),而不是目标的OpenSSL(即,
libssl
libcrypto
中的/usr/local/ssl/android/lib`)。要修复它,我找到的最简单的方法是指定库的完整路径:

LIBS += /usr/local/ssl/android/lib/libssl.a /usr/local/ssl/android/lib/libcrypto.a
您必须避免只使用
-lssl-lcrypto
,它链接到共享对象(如果可用)。Android支持OpenSSL 0.9.8。因此,您将在编译时针对1.0.1h进行编译,但在运行时针对Androids 0.9.8进行链接。这将导致一系列无法解释的错误


这种行为的发生是因为Android的主进程——Zygote——在启动后加载OpenSSL的0.9.8版本。在受精卵分叉进入您的进程后,0.9.8已经加载。他们的操作系统不会加载您的1.0.1版本,因为链接相关性已经满足。

我想总结一下解决方案(这是我的主观意见):

  • 只有openssl 0.9.8za与android一起工作
  • 必须添加libcrypto.a(thankx@jww)
我的setenv-android.sh“可编辑”变量:

_ANDROID_NDK="android-ndk-r10"
_ANDROID_EABI="arm-linux-androideabi-4.8"
_ANDROID_ARCH=arch-arm
_ANDROID_API="android-14"
建造过程:

$ . ./setenv-android.sh
$ tar xzf openssl-0.9.8za.tar.gz
$ cd openssl-0.9.8za/
$ ./config
$ make
.pro文件:

LIBS+=-lcrypto
PKGCONFIG += openssl
# FORMS, SOURCES, TARGET, etc...

unix:!macx: LIBS += -L$$PWD/../SSL/openssl-0.9.8za/ -lcrypto

INCLUDEPATH += $$PWD/../SSL/openssl-0.9.8za/include
DEPENDPATH += $$PWD/../SSL/openssl-0.9.8za/include

unix:!macx: PRE_TARGETDEPS += $$PWD/../SSL/openssl-0.9.8za/libcrypto.a

对我有用的是:编辑openssl Makefile.shared并替换

-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX

这样,库的内部名称将更改为do libcrypto.so和libssl.so,而不是libcrypto.so.1.0.0

清理并重新编译openssl和您的应用程序。

解决方案是:

1a)正确的方法:为android编译openssl库(使用1.0.2+,不要使用1.1.*-至少对于Qt5.9.2)

1b)快速肮脏的方式:如果您需要快速肮脏的解决方案,请从任何现有应用程序APK(警告:过时的libs==>安全威胁)获取它们。在APK arm目录中查找libssl.so和libcrypto.so

然后

2a)打开Qt Creator,Projects->[project]->Build&Run->Android for armeabi->v7a->Build->Build->Build Android APK->Android->Add。。(在此处添加libssl.so、libcrypto.so)

2b)在.pro makefile中,添加以下内容:

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
     ANDROID_EXTRA_LIBS = \
        $$PWD/android/libs/arm/libcrypto.so \
        $$PWD/android/libs/arm/libssl.so
}
($$PWD/android/。是项目中放置这些lib的路径)。ANDROID_PACKAGE_SOURCE_DIR在本例中看起来是可选的

然后

3) 添加它们以加载到AndroidManifest(至少对Qt5.9.2有效):小心地将它们添加到主活动和进程外服务(如果有)的现有元数据中

        <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --:lib/libssl.so:lib/libcrypto.so"/>
我把这个说明放在这里,因为我花了太多时间寻找答案,没有ANDROID的任何东西都不适合我

为什么这么麻烦?因为androids 6.0之前可能包含自己的libssl/libcrypto,通过“-l”链接将在主二进制文件中添加自动加载条目(非Qt管理),并且系统libs可能版本错误,或者以静默方式加载而不是加载附带的二进制文件,从而掩盖了Android 7的错误。安卓7肯定不包含libssl,“-l”将失败,并且在运行时无法解析符号

通过不使用“-l”和使用Qt的“android.app.load_local_libs”,您可以强制QtLoader使用您的libs版本。请记住,openssl 1.0.2正在使用默认的android Qt构建,而1.1.*由于符号不同而无法工作。(SSL_init_库为1.0.2,OPENSSL_init_库为1.1.*)


有趣的是,由于这些复杂性,方法“1b”可能不起作用。您选择的APK可能包含libssl.so,但它的作者不正确地构建了它并加载了它,所以他的libssl.so可能是不正确的版本共享库,通常在android上不可用,但作者使用了-l,从未加载过自己的库(而是使用的系统),也不知道他的库不会加载到android上。

我收到了此错误消息(openssl-1.0.1h):无法加载库:link_image[1892]:312无法加载“libOpenSSLGUI.so”所需的库“libcrypto.so.1.0.0”(加载库[1094]:未找到库“libcrypto.so.0.0”)@bastlaca-您的
libOpenSSLGUI.so
应该链接到存档
libcrypto.a
;而不是共享对象
libcrypto.so