通过NDK访问的OpenSSL AES_ENCRYPT函数时未定义引用错误 [英] Undefined reference error when accessing OpenSSL AES_encrypt function through NDK

查看:1431
本文介绍了通过NDK访问的OpenSSL AES_ENCRYPT函数时未定义引用错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图写一个使用OpenSSL开源库Android的加密/解密文件的包装。所以,我创建了一个NDK Android项目编译使用NDK库OpenSSL的。

下面是项目结构:

Android项目
    SRC
    JNI
        的OpenSSL 1.0.1e(文件夹包含OpenSSL的源$ C ​​$ C)
            加密(文件夹包含加密源$ C ​​$ C)
                Android.mk(Android的makefile文件来定义STATIC_LIBRARY)            包括
                OpenSSL的(文件夹包含头文件)        包装(文件夹包含包装源$ C ​​$ C,我在这里实现)
            aes_wrapper.c(我的包装实现)
            Android.mk(Android的makefile文件来定义SHARED_LIBRARY)        Android.mk(Android的生成文件调用的所有子机器人的makefile)
        Application.mk(应用程序生成文件,我用它来定义APP_ABI)

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

LOCAL_PATH:= $(叫我-DIR)包括$(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/opensslLOCAL_SRC_FILES:=这里所有的源文件LOCAL_MODULE:=加密包括$(BUILD_STATIC_LIBRARY)

下面是在文件夹JNI /包装Android.mk内容

LOCAL_PATH:= $(叫我-DIR)包括$(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/opensslLOCAL_SRC_FILES:= aes_wrapper.cLOCAL_STATIC_LIBRARIES + =加密LOCAL_MODULE:= aes_wrapper包括$(BUILD_SHARED_LIBRARY)

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

 包含$(调用所有子目录,makefile文件)

下面是在文件夹JNI Application.mk的含量

  APP_ABI:=所有

当我打电话NDK的构建我得到了一些未定义的引用的错误。我一直在试图解决一两天,但不幸的是我没有成功。谁能帮助我?任何帮助将AP preciated。

编辑:我有一堆像这样的错误

<$p$p><$c$c>/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/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:函数加密:JNI /包装/ aes_wrapper.c:21:错误:未定义引用AES_ENCRYPT


解决方案

  

当我打电话NDK的构建我得到了一些未定义的引用的错误。我一直在试图解决一两天,但不幸的是我没有成功。


这听起来像 AES_ENCRYPT 不是你只错误。对于 AES_ENCRYPT ,这里的地方它位于:

  $的grep -R AES_ENCRYPT *
加密/ AES / aes.h:无效AES_ENCRYPT(const的无符号字符*中,无符号字符*出来,
...
加密/ AES / aes_core.c:无效AES_ENCRYPT(const的无符号字符*中,无符号字符*出来,
...

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

不过,你必须 LOCAL_STATIC_LIBRARIES + =加密,你可以验证功能与NDK的版本纳米(我相信它的 ARM-Linux的androideabi纳米),如下所示。你想看到一个条目 T T 是文字部分的定义):

  $纳米libcrypto.a | grep的-i AES_ENCRYPT
...
                 üAES_ENCRYPT
0000000000000460ŧAES_ENCRYPT
00000000亿吨_x86_64_AES_encrypt
00000000000001f0ŧ_x86_64_AES_encrypt_compact
...

如果您仍然有问题,OpenSSL,以便在命令行构建库的NDK之外提供方向构建系统。请参见 FIPS库和Android (并跳过FIPS一部分)。从构建FIPS有能力图书馆

 #从根目录
$。 ./setenv-android.sh
$ CD的OpenSSL 1.0.1e /$ ./config中共享无SSL2无补偿无-HW没有发动机\\
    --openssldir =的/ usr /本地/ SSL / $ ANDROID_API$靠化妆
$让所有
$ sudo的-E使安装\\
    CC = $ ANDROID_TOOLCHAIN​​ / ARM-Linux的androideabi-GCC \\
    RANLIB = $ ANDROID_TOOLCHAIN​​ / ARM-Linux的androideabi-ranlib的

在上面的配方, ANDROID_TOOLCHAIN​​ 是由 setenv-android.sh 脚本设置。

此外,通常可以在Github上找到的东西prebuilt。 http://www.google.com/search?q=openssl +安卓+网站:github.com

I am trying to write a wrapper for encryption/decryption file for Android using OpenSSL open source library. So I created a NDK Android project to compile library OpenSSL using NDK.

Here is project structure:

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)

Here is content of Android.mk in folder jni/openssl-1.0.1e/crypto

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)

Here is content of Android.mk in folder jni/wrapper

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)

Here is content of Android.mk in folder jni

include $(call all-subdir-makefiles)

Here is content of Application.mk in folder jni

APP_ABI := all

When I call ndk-build I got some "undefined reference to" errors. I have been trying to fix a couple of days but unfortunately I was not successful. Could anyone help me? Any help will be appreciated.

EDIT: I got bunch of errors like this

/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'

解决方案

When I call ndk-build I got some "undefined reference to" errors. I have been trying to fix a couple of days but unfortunately I was not successful.

It sounds like AES_encrypt is not you only error. For AES_encrypt, here's where its located:

$ 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,
...

I don't use the NDK build system, so I'm not sure if aes_core.c is actually being compiled from your example.

However, you do have LOCAL_STATIC_LIBRARIES += crypto, and you can verify the function is present in the archive with the NDK's version of nm (I believe its arm-linux-androideabi-nm) as follows. You want to see an entry with a T (T is a definition in the Text section):

$ 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
...

If you are still having trouble, OpenSSL offers direction for building the library from the command line outside of the NDK build system. See FIPS Library and Android (and skip the FIPS part). From 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

In the recipe above, ANDROID_TOOLCHAIN is set by the setenv-android.sh script.

Also, you can usually find something prebuilt on Github. http://www.google.com/search?q=openssl+android+site:github.com

这篇关于通过NDK访问的OpenSSL AES_ENCRYPT函数时未定义引用错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆