我正在尝试使用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'
我会建议你在你的问题中包括完整的错误文本。 –
你应该*不*使用'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