Tan*_*cho 3 android openssl android-ndk 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 datasize, String password, int passSize);
Run Code Online (Sandbox Code Playgroud)
接下来我有一个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编译并链接一切(如果有人有时间,我会很感激一个简单的示例项目)
所以我在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)
Run Code Online (Sandbox Code Playgroud)
在调用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.
Run Code Online (Sandbox Code Playgroud)
因为你已经可以猜测路径是完全错误的,让我感到困惑的是$ {LOCAL_PATH}返回第一批包含的正确路径和.so文件的完全错误...任何帮助都将非常感谢!
这是解决方案,更新为NDK8c
第零步:下载并修复Android NDK我不知道如何但是ndk有一个非常有趣的缺陷,(在我的观点中)不允许你编译很多东西,所以为了能够编译OpenSSL你需要做一个小修复,提取ndk8c,无论你保留你的工具,然后编辑文件:android-ndk-r8c/build/gmsl/__ gmsl line 512:change line
int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int))
Run Code Online (Sandbox Code Playgroud)
用线
int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))
Run Code Online (Sandbox Code Playgroud)
你很高兴去!
第一步:下载OpenSSL并为Android编译:要么编译这里找到的移植版本, 要么下载OpenSSL的官方1.0.0c版本,然后使用github提供的手册为Android编译,我为Android兼容版本链接
所以下一步是获取libssl.so和libcrypto.so 并将它们放在NDK文件夹中以便于访问,因此从中复制它们
openssl-folder/libs/armeabi/
Run Code Online (Sandbox Code Playgroud)
至
android-ndk-r8c/platforms/android-8/arch-arm/usr/lib
Run Code Online (Sandbox Code Playgroud)
这种方式在编译时可以使用简单的链接器开关包含库 -lssl -lcrypto
第二步:在这里获取Curl的最新资源
在Docs/INSTALL中打开文件并按照制作独立工具链所需的步骤放入所需的文件夹,然后是棘手的部分,我需要安装android的源代码以继续配置,即使我有一个独立的编译openssl你也可以从那里包含头文件,无论如何这是更复杂的版本,所以你选择你做的,我没有选择逃避它们,所以你可以去谷歌AOSP网站,并通过步骤来构建和初始化环境.
所以它会是这样的:
1.download,
转到源代码的根目录并运行:
〜:build/envsetup.sh; 午餐1; 使;
所以最后我们需要用SSL支持编译curl,所以,
第三步
将curl提取到所需的文件夹(我特别希望禁用除http/s之外的所有内容以使库尽可能小,意味着大约300k,如果你想在你的lib中有更多协议,请删除--disable-protocol for the所需协议)运行以下内容:
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.
Run Code Online (Sandbox Code Playgroud)
所以最后你有:静态:
curl-7.28.1/lib/.libs/libcurl.a
Run Code Online (Sandbox Code Playgroud)
并分享:
curl-7.28.1/lib/.libs/libcurl.so.5.3
Run Code Online (Sandbox Code Playgroud)
所以就是这样..拿走文件,然后编译掉:)