openSSL使用Android的NDK问题

时间:2012-04-23 17:25:48

标签: android android-ndk openssl android-ndk-r7

我有以下情况, 我正在使用OpenSSL移植一个应用程序用于AES加密,我已经编译了所有内容,但链接器失败了。情况如下: 我写了一个简单的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-build时,它会构建所有的拇指,因此编译器会正确编译它们。 接下来我需要移植openssl for android,我使用了这个OpenSSL for Android 它就像一个带有简单ndk-build的char(在项目的根目录中),并构建了libssl.so和libcrypto.so

所以我需要连接这两个..我觉得连接构建脚本是一个挑战,所以一个ndk-build编译并链接一切(如果有人有时间,我会很感激一个简单的示例项目)< / p>

所以我在jni / includes / prebuilt中复制了已编译的libssl和libcrypto .so文件,并希望将它们包含在项目中,以便链接器能够最终创建我将在最后使用的lib。

我有以下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-build时,我得到了一个令人失望的

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文件的完全错误路径... 任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:8)

这是解决方案,更新为NDK8c

第0步:下载并修复Android NDK 我不知道如何但ndk有一个非常有趣的缺陷,(在我的意见中)并不能让你编译很多东西,所以为了能够编译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编译: 编译找到here的移植版本 或者下载OpenSSL的官方1.0.0c版本,然后使用我为Android兼容版本链接的github中提供的手册为Android编译

所以下一步是获取 libssl.so libcrypto.so 并将它们放在NDK文件夹中以便于访问,因此请从

复制它们
openssl-folder/libs/armeabi/

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

这种方式在编译时可以使用简单的链接器开关-lssl -lcrypto

包含libs

第二步:获取Curl here

的最新来源

在Docs / INSTALL中打开文件,按照制作独立工具链所需的步骤放入所需的文件夹,然后是棘手的部分,我需要安装android的源代码才能继续配置,即使我有一个独立的编译openssl,你也可以从那里包含头文件,无论如何这是更复杂的版本,所以你选择你做的,我没有选择逃避它们所以你可以去Google AOSP site并通过步骤来构建和初始化环境。

所以它会是这样的:

1.download,

  1. 转到源代码的根目录并运行:

    〜:build / envsetup.sh;午餐1;使

  2. 所以最后我们需要使用SSL支持编译curl,所以,

    第三步

    将curl提取到所需的文件夹 (我特别希望禁用除http / s之外的所有内容以保持库尽可能小,意味着大约300k,如果你想在你的lib中有更多的协议,删除所需协议的--disable-protocol) 运行以下内容:

    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
    

    这就是它......拿走文件,然后编译掉:)

答案 1 :(得分:0)

@Tancho

我对你提到的行__gmsl:512进行了更改。虽然它允许OpenSSL编译,但它也打破了$(BUILD_EXECUTABLE)可执行文件的构建。在更改之前,我的简单hello world应用程序编译并运行,但是在更改之后它会编译但在我的Nexus上运行它会导致seg错误。

恢复更改,一切顺利。我不知道如何解决这个问题,我真的不知道那条线是做什么的,但这只是对任何人做出改变的一点警告。