我有以下情况, 我正在使用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文件的完全错误路径... 任何帮助都会非常感激!
答案 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
第二步:获取Curl here
的最新来源在Docs / INSTALL中打开文件,按照制作独立工具链所需的步骤放入所需的文件夹,然后是棘手的部分,我需要安装android的源代码才能继续配置,即使我有一个独立的编译openssl,你也可以从那里包含头文件,无论如何这是更复杂的版本,所以你选择你做的,我没有选择逃避它们所以你可以去Google AOSP site并通过步骤来构建和初始化环境。
所以它会是这样的:
1.download,
转到源代码的根目录并运行:
〜:build / envsetup.sh;午餐1;使
所以最后我们需要使用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错误。
恢复更改,一切顺利。我不知道如何解决这个问题,我真的不知道那条线是做什么的,但这只是对任何人做出改变的一点警告。