2014-01-06 103 views
1

我正在尝试使用OpenSSL开放源代码库为Android编写加密/解密文件的封装器。所以我创建了一个NDK Android项目来使用NDK编译库OpenSSL。通过NDK访问OpenSSL AES_encrypt函数时出现未定义的引用错误

下面是项目结构:

Android Project 
    src 
    jni 
     openssl-1.0.1e  (folder contains openssl source code) 
      crypto   (folder contains crypto source code) 
       Android.mk (the Android makefile to define STATIC_LIBRARY) 

      include 
       openssl (folder contains header files) 

     wrapper   (folder contains wrapper source code, my implementation here) 
      aes_wrapper.c (my wrapper implementation) 
      Android.mk  (the Android makefile to define SHARED_LIBRARY) 

     Android.mk   (the Android makefile that calls all sub android makefiles) 
     Application.mk  (the Application makefile, I use to define APP_ABI) 

以下是文件夹Android.mk内容JNI /的OpenSSL 1.0.1e /加密

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_C_INCLUDES := \ 
    $(NDK_PROJECT_PATH) \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto/asn1 \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto/aes \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto/evp \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/include \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/include/openssl 

LOCAL_SRC_FILES := all source files here 

LOCAL_MODULE := crypto 

include $(BUILD_STATIC_LIBRARY) 

以下是文件夹Android.mk的内容JNI /包装

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_C_INCLUDES := \ 
    $(NDK_PROJECT_PATH) \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto/asn1 \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto/aes \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/crypto/evp \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/include \ 
    $(NDK_PROJECT_PATH)/jni/openssl-1.0.1e/include/openssl 

LOCAL_SRC_FILES := aes_wrapper.c 

LOCAL_STATIC_LIBRARIES += crypto 

LOCAL_MODULE := aes_wrapper 

include $(BUILD_SHARED_LIBRARY) 

以下是在文件夹JNI Android.mk的内容

include $(call all-subdir-makefiles) 

这里是文件夹JNI

APP_ABI := all 

Application.mk的内容当我打电话NDK建造我得到了一些“未定义的引用”错误。我一直在努力修复几天,但不幸的是我没有成功。任何人都可以帮我吗?任何帮助将不胜感激。

编辑:我得到了一堆错误这样

/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: 
./obj/local/armeabi-v7a/objs/aes_wrapper/aes_wrapper.o: in function encrypt:jni/wrapper/aes_wrapper.c:21: error: undefined reference to 'AES_encrypt' 
+1

我会建议你在你的问题中包括完整的错误文本。 –

+0

你应该*不*使用'AES_encrypt'和朋友。您应该使用'EVP_ *'功能。请参阅[EVP对称加密和解密](https://wiki.openssl.org/index。php/EVP_Symmetric_Encryption_and_Decryption)在OpenSSL wiki上。事实上,您应该使用经过身份验证的加密,因为它提供了*机密性和真实性。请参阅OpenSSL wiki上的[EVP Authenticated Encryption and Decryption](https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)。 – jww

回答

2

当我打电话NDK建造我得到了一些“未定义的引用”错误。我一直在努力修复几天,但不幸的是我没有成功。

听起来像AES_encrypt不是你唯一的错误。对于AES_encrypt,这里的地方其设:

$ grep -R AES_encrypt * 
crypto/aes/aes.h:void AES_encrypt(const unsigned char *in, unsigned char *out, 
... 
crypto/aes/aes_core.c:void AES_encrypt(const unsigned char *in, unsigned char *out, 
... 

我不使用NDK编译系统,所以我不知道如果aes_core.c实际上正在从你的榜样编译。

但是,你必须LOCAL_STATIC_LIBRARIES += crypto,你可以验证功能存在于与NDK的版本nm存档(我相信它arm-linux-androideabi-nm)如下。你想看到一个T条目(T是在文本部分定义):

$ nm libcrypto.a | grep -i AES_encrypt 
... 
       U AES_encrypt 
0000000000000460 T AES_encrypt 
0000000000000000 t _x86_64_AES_encrypt 
00000000000001f0 t _x86_64_AES_encrypt_compact 
... 

如果您仍然有问题,OpenSSL的提供方向从命令行构建库的NDK构建的外系统。请参阅FIPS Library and Android(并跳过FIPS部分)。从Build the FIPS Capable Library

# From the 'root' directory 
$ . ./setenv-android.sh 
$ cd openssl-1.0.1e/ 

$ ./config shared no-ssl2 no-comp no-hw no-engine \ 
    --openssldir=/usr/local/ssl/$ANDROID_API 

$ make depend 
$ make all 
$ sudo -E make install \ 
    CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc \ 
    RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib 

在上面的配方,ANDROID_TOOLCHAINsetenv-android.sh脚本设置。

此外,你通常可以找到预构建在Github上的东西。 http://www.google.com/search?q=openssl+android+site:github.com

+0

非常感谢您的帮助。 –

相关问题