OpenSSL的使用Android的NDK问题(openSSL using Android'

2019-06-23 21:07发布

我有以下的情况,我移植了一块使用OpenSSL AES加密的应用程序,我把一切都编译,但链接失败。 这种情况如下:1,我写了一个JNI包装,简单地做:

private native String cipherString(String plainData, int datasize, String password, int passSize);
private native String decipherString(String cipheredData, int datasize, String password, int passSize);

接下来我有一个C ++文件,我称之为有适当的JNI sintax它转换的jstring为char *和所有其他必要的变革,并使得到实际进口的OpenSSL头(目前,占)其他CPP文件的调用,并调用OpenSSL的方法用于加密和解密。

所以,当我打电话NDK建造,它建立笨手笨脚的,所以编译器正确编译它们。 接下来我需要端口OpenSSL,以便机器人,我用这个OpenSSL的为Android ,其工作原理是用一个简单的NDK构建一个字符(在项目的根着,当然),并建立libssl.so和libcrypto.so

所以,我需要连接两个..我觉得它连接构建脚本是一个挑战,让一个NDK建造编译和linkes一切(我希望一个简单的示例项目,如果有人有时间的话)

所以我复制编译的libssl和libcrypto在JNI /包括/预建的,并希望它们包括在项目链接器能够最终创造出我将在年底用lib .so文件。

我有以下Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/includes/build/common.mk
include $(LOCAL_PATH)/includes/build/common_includes.mk
APP_STL := gnustl_static

LOCAL_MODULE    := packer
LOCAL_SRC_FILES := modules/cipher/wrapper.cpp \
                    ... #rest of the cpp code

LOCAL_C_INCLUDES += $(LOCAL_PATH)/includes/openssl 
LOCAL_SHARED_LIBRARIES := $(LOCAL_PATH)/includes/precompiled/libssl.so \
            $(LOCAL_PATH)/includes/precompiled/libcrypto.so 
LOCAL_SHARED_MODULES := sslx cryptox
include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sslx
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cryptox
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)

并呼吁NDK建造时,我得到一个dissapointing

sslx: LOCAL_SRC_FILES points to a missing file. Check that /home/user/Development/Tools/sdk/android/ndk/build/core//home/user/Development/Tools/sdk/android/ndk/build/core/includes/precompiled/libssh.so exists  or that its path is correct. Aborting    .  Stop.

因为你已经猜出路径是完全错误的,什么让我困惑的是,$ {} LOCAL_PATH为第一批包括和完全错误的一种为.so文件...任何帮助将非常感激的返回正确路径!

Answer 1:

这里是解决方案,更新NDK8c

第零步 :下载并修复了Android NDK我不知道怎么样,但NDK有一个很有趣的缺陷,这(在我oppinion)不会让你编译的东西很多的,这样一来就能编译OpenSSL的,你需要做一个小补丁,解压ndk8c徘徊无论你把你的工具,然后编辑该文件:Android的NDK-R8C /编译/ GMSL / __ GMSL行512:改线

int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int))

与线

int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))

你是好去!

步骤一 :下载OpenSSL和编译Android的:要么编译发现了一个移植版本, 在这里或下载的OpenSSL的官方1.0.0c版本,然后用我联系为Android兼容版本的github上提供的手动编译为Android

因此,下一步是让libssl.solibcrypto.so并把它们易于访问的文件夹NDK,因此从它们复制

openssl-folder/libs/armeabi/

android-ndk-r8c/platforms/android-8/arch-arm/usr/lib

这样编译你可以使用一个简单的链接器开关包括库时-lssl -lcrypto

第二步 :把卷曲的最新源在这里

在文件中开启文件/安装,然后做出独立的工具链所需的步骤,并在您需要的文件夹,然后将棘手的部分,我需要有Android的源代码,配置继续,即使我有一个独立的编译OpenSSL的,您可以包含有太多的头文件,在anycase这是更复杂的版本,让你选择,你做了什么,我没有选择逃避他们,所以你可以去谷歌AOSP网站和走线槽的步骤来建立和初始化环境。

所以它会是这样的:

1.download,

  1. 去的源代码和运行的根本:

    〜:构建/ envsetup.sh; 午餐1; 使;

所以最后我们需要编译卷曲支持SSL,因此,

第三步

提取卷曲到所需的文件夹(我有禁用一切,除了HTTP / S,以保持库小到约30万〜如果你想在你的lib更多的协议,去掉 - 禁用协议的可能含义的具体愿望期望的协议)运行以下:

make clean

export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH

export LDFLAGS="\
-lssl \
-lcrypto \
-L/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/lib"

export CFLAGS="\
-I/home/user/Development/AOSP/2.3.7/system/core/include \
-I/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/include"

./configure --host=arm-linux-androideabi \
--with-ssl=/home/user/Development/Projects/portingLibs/openssl-android-master \
--disable-ftp \
--disable-gopher \
--disable-file \
--disable-imap \
--disable-ldap \
--disable-ldaps \
--disable-pop3 \
--disable-proxy \
--disable-rtsp \
--disable-smtp \
--disable-telnet \
--disable-tftp \
--without-gnutls \
--without-libidn \
--without-librtmp \
--disable-dict


make



Note that in the block above, if you don't want to use the AOSP source, you could switch 

-I/home/user/Development/AOSP/2.3.7/system/core/include \

with the include folder for your ssl distribution.

所以,最后你有:静态:

curl-7.28.1/lib/.libs/libcurl.a

和共享:

curl-7.28.1/lib/.libs/libcurl.so.5.3

所以这是它..拿那个文件,然后进行编译:)



Answer 2:

@Tancho

我所做的更改线路__gmsl:你提到的512。 虽然它让OpenSSL的编制也打破可执行文件由$(BUILD_EXECUTABLE)建设。 本次变动前我简单的Hello World应用程序编译和运行,但更改后它编译但在赛格故障我的Nexus结果运行它。

恢复更改,一切都很好再次。 我不知道如何解决这个问题,我真的不知道这行做了什么,但是这仅仅是一个小小的警告任何人做出这样的转变。



文章来源: openSSL using Android's NDK problems