使用Android的openSSL';s NDK问题

使用Android的openSSL';s NDK问题,android,android-ndk,openssl,android-ndk-r7,Android,Android Ndk,Openssl,Android Ndk R7,我有以下情况,, 我正在移植一个使用OpenSSL进行AES加密的应用程序,我已经编译了所有内容,但是链接器失败了。情况如下: 1.我编写了一个JNI包装器,它可以: private native String cipherString(String plainData, int datasize, String password, int passSize); private native String decipherString(String cipheredData, int datas

我有以下情况,, 我正在移植一个使用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 SunCalf,它将JSnG转换为char *和所有其他需要的转换,并调用另一个CPP文件,该文件实际上导入了OpenSSL头(现在和已占),并调用OpenSSL加密和解密方法。 因此,当我调用ndk build时,它会生成所有拇指,因此编译器会正确编译它们。 接下来,我需要为android移植openssl,我使用了这个 它的工作原理类似于一个简单ndk构建的char(当然是在项目的根目录中),并构建libssl.so和libcrypto.so

所以我需要把两者联系起来。。我发现连接构建脚本是一个挑战,因此一个ndk构建可以编译和链接所有内容(如果有人有时间,我希望有一个简单的示例项目)

因此,我复制了jni/includes/prebuild中编译的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文件返回完全错误的路径。。。
任何帮助都将不胜感激

这是更新为NDK8c的解决方案

第0步:下载并修复Android NDK 我不知道怎么做,但ndk有一个非常有趣的缺陷,它(在我看来)不允许你编译很多东西,所以要编译OpenSSL,你需要做一个小的修复,提取ndk8c,无论你在哪里保存你的工具,然后编辑文件: android-ndk-r8c/build/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版本,然后使用github中提供的手册为android编译它,我链接了android兼容版本

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

openssl-folder/libs/armeabi/

通过这种方式,在编译时,您可以使用一个简单的链接器开关
-lssl-lcrypto

第二步:获取Curl最新的

在Docs/INSTALL中打开文件,按照创建独立工具链所需的步骤并放入所需的文件夹,然后是棘手的部分,我需要android的源代码来继续配置,即使我有一个独立编译的openssl,您也可以从中包含头文件,无论如何,这是一个更复杂的版本,所以你可以选择你要做的事情,我没有选择回避它们,这样你就可以继续进行构建和初始化环境的步骤

所以它会是这样的:

1.下载

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

    ~:build/envsetup.sh;午餐1;制作

  • 最后,我们需要使用SSL支持编译curl

    第三步

    将curl提取到所需文件夹 (我特别希望禁用除http/s之外的所有功能,以使库尽可能小,即大约300k,如果您希望库中有更多协议,请删除所需协议的--disable协议) 运行以下命令:

    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
    
    就这样。。取出文件,然后编译:)

    @Tancho

    我更改了您提到的第512行。虽然它允许OpenSSL编译,但它也将可执行文件的构建中断了$(BUILD\u EXECUTABLE)。在更改之前,我的简单hello world应用程序会编译并运行,但在更改之后,它会编译,但在我的Nexus上运行会导致seg故障


    恢复改变,一切都会好起来。我不知道如何解决这个问题,我真的不知道这条线的作用是什么,但这只是对任何做出更改的人的一个小小警告。

    如果问题解决了,您可以将您的解决方案标记为答案。。。在对uu gsml应用修复程序后,我得到一个错误:Android NDK:你的应用程序构建脚本指向一个未知文件:/Android.mk d:/Development/Android/Android-NDK-r8c/BUILD/core/add application.mk:165:**Android NDK:中止。停止你是在哪个平台上运行的?窗户?你有可能把libcrypto.so libssl.so上传到某个地方吗?你能告诉我们你是如何在Android.mk文件中链接所有这些的吗?很有趣。。我也做了同样的改变。到目前为止,这一切都很好,但仍然保持谨慎有助于……我最终通过以下替换解决了这个问题:从
    int\u encode=$(\uu gmsl\u tr1)$(单词表1,$1,$(\uu gmsl\u input\u int))
    int\u encode=$(\uu gmsl\u tr1)$(单词表1,$(如果$1,$1,$0),$(\uu gmsl\u input\u int))
    这很好地处理了$1为空的情况,在这种情况下返回0。
    curl-7.28.1/lib/.libs/libcurl.so.5.3