3

我有以下情况,我正在移植一个使用 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 * 和所有其他需要的转换,并调用另一个 cpp 文件,该文件实际上导入 openssl 标头(存在和占)并调用 openssl 方法用于加密和解密。

因此,当我调用 ndk-build 时,它会构建所有拇指,因此编译器会正确编译它们。接下来我需要为 android 移植 openssl,我使用了这个用于 Android 的 OpenSSL, 它就像一个带有简单 ndk-build 的字符(当然在项目的根目录中)并构建 libssl.so 和 libcrypto.so

所以我需要将两者连接起来。我发现连接构建脚本是一个挑战,因此一个 ndk-build 编译并链接所有内容(如果有人有时间,我将不胜感激一个简单的示例项目)

所以我在 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 文件返回完全错误的路径......任何帮助将不胜感激!

4

2 回答 2

8

这是解决方案,更新到NDK8c

零步:下载并修复 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 版本,然后使用我为 Android 兼容版本链接的 github 中提供的手册为 android 编译它

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

openssl-folder/libs/armeabi/

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

这样编译时,您可以使用简单的链接器开关包含库-lssl -lcrypto

第二步:在这里获取 Curl 的最新资源

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

所以它会是这样的:

1.下载,

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

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

所以最后我们需要编译带有 SSL 支持的 curl,所以,

第三步

将 curl 提取到所需的文件夹(我特别希望禁用除 http/s 之外的所有内容,以使库尽可能小,这意味着大约 300k,如果您想要在您的库中使用更多协议,请删除 --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

就是这样..取文件,然后编译:)

于 2012-04-24T09:58:10.523 回答
0

@Tancho

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

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

于 2013-01-16T22:27:41.180 回答