2014-09-24 157 views
3

我试图使用Android-OpenSSLibraries进行AES解密的简单测试程序。编译器/链接器向我显示一个错误。编译:Android NDK编译器openssl发生错误

error: undefined reference to 'AES_set_encrypt_key' 
error: undefined reference to 'AES_encrypt' 
error: undefined reference to 'AES_set_decrypt_key' 

这是我的Android.mk文件,

LOCAL_PATH := $(call my-dir) 
$(info $(LOCAL_PATH)) 
include $(CLEAR_VARS) 

LOCAL_MODULE := demo 
LOCAL_CFLAGS := -I/some/include/path 
LOCAL_LDLIBS := \ 
     -llog \ 
     -lz \ 
     -lm \ 

LOCAL_SRC_FILES := \ 
     aes_api.c \ 
     io_module.cpp \ 
     jni_native.cpp \ 
     JniConstants.cpp \ 
     JNIHelp.cpp \ 
     libcrypto.so \ 
    PosixFile.cpp \ 

LOCAL_C_INCLUDES := \ 
    $(LOCAL_PATH)/include \ 
    $(LOCAL_PATH)/include/openssl 
$(info $(LOCAL_C_INCLUDES)) 

LOCAL_SHARED_LIBRARIES := \ 
     $(LOCAL_PATH)/libcrypto.so 

include $(BUILD_SHARED_LIBRARY) 

回答

1

LOCAL_SHARED_LIBRARIES内容是不正确。您必须为其指定模块,而不是指向共享对象的路径。

你应该定义这个变量之前执行以下操作:

include $(CLEAR_VARS) 

#Name it as you want, it doesn't matter. For consistency, let's name it LibCrypto 
LOCAL_MODULE := LibCrypto 
LOCAL_EXPORT_C_INCLUDES := <path/to/Libcrypto/includes> 
LOCAL_SRC_FILES := <path/to/libCrypto/shared/object>/libcrypto.so 

include $(PREBUILT_SHARED_LIBRARY) 

,然后在LOCAL_SHARED_LIBRARIES你直接用模块的名字引用它:

LOCAL_SHARED_LIBRARIES := LibCrypto 

请注意,您可以添加更多的那一个通过定义其他这样的“模块”,您甚至可以预先建立自己(使用include $(BUILD_SHARED_LIBRARY)),然后通过以下方式引用多个模块:

LOCAL_SHARED_LIBRARIES := module1 \ 
          module2 \ 
          ... 

我强烈建议您访问,并保持约the Android.mk specification

+0

是的,你是right.But我照你说的,编译器显示我的另一个错误此链接:LOCAL_SRC_FILES应指向一个文件结尾“.a”以下文件不受支持:/libcrypto.so – user4073982 2014-09-24 09:47:58

+0

@ user4073982这很奇怪,我使用它,而且'PREBUILT_SHARED_LIBRARY'的文档明确地说:“与'BUILD_SHARED_LIBRARY'和'BUILD_STATIC_LIBRARY'不同,'LOCAL_SRC_FILES '必须是预建的共享库的单一路径(例如, 'foo/libfoo.so'),而不是源文件。“ – JBL 2014-09-24 09:52:12

+0

是的,LOCAL_SRC_FILES是共享库的路径,在mk文件中是LOCAL_SRC_FILES:= $(LOCA_PATH)/libcrypto.so,但我不知道在哪里 – user4073982 2014-09-24 09:59:56