我遇到了尝试使用SSL支持将cURL编译到应用程序中的问题。
到目前为止,我已成功将openSSL包编译为libcrypt.so和libssl.so。
我相信我已经使用configure脚本成功编译了一个带有SSL支持的libcurl.a版本,并通过NDK中的交叉链编译器运行它(在linux环境下)。
现在,我正在尝试在Eclipse下编写一个可以被Android应用程序的Java代码调用的.so库。
到目前为止,这是文件结构:
Project Folder ---> jni ---> include ---> curl ---> curl headers
| |
| -> openssl ---> ssl and crypto headers
|
-> libcrypto.so
-> libssl.so
-> libcurl.a
-> jniProcessRequest.c
-> Android.mk
Android.mk上写着:
LOCAL_PATH := $(call my-dir)
MY_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_PATH := $(MY_PATH)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := libcrypto.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/openssl/
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := libssl.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/openssl/
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := curl
LOCAL_SRC_FILES := libcurl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/curl/
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := JNIProcessRequest
LOCAL_SRC_FILES := JNIProcessRequest.c
LOCAL_SHARED_LIBRARIES := crypto ssl
LOCAL_STATIC_LIBRARIES := curl
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
jniProcessRequest.c:
#include <jni.h>
#include <stdlib.h>
#include "include/curl/curl.h"
#include <android/log.h>
JNIEXPORT void JNICALL Java_com_example_jniprocessrequest_MainActivity_jniProcessRequest(JNIEnv * env, jobject obje){
CURL *conn;
conn = curl_easy_init();
}
每次我尝试编译上面的内容时,我在Eclipse中都有未定义的引用错误:
make: *** [obj/local/armeabi/libJNIProcessRequest.so] Error 1
undefined reference to 'curl_easy_init'
我认为这是某种联系错误,但我很难找到错误发生的地方。我花了将近两天时间尝试将共享库放在不同位置的所有不同方法,使用共享libcurl切换静态libcurl,更改Android.mk文件以及关于如何在Android中使用cURL的教程。
非常感谢任何帮助!
答案 0 :(得分:2)
我认为问题源于错误构建的libcurl.a静态库。我用GitHub上的用户编译的库替换了我的库,并且没有更改任何代码,链接错误消失了。
答案 1 :(得分:0)
您使用curl
作为预建模块。
正如NDK文档中所述,您应该注意将其包含在include $(CLEAR_VARS)
和(最重要的)include $(PREBUILT_STATIC_LIBRARY)
指令下,如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.a
include $(PREBUILT_STATIC_LIBRARY)
小心谨慎地将JNIProcessRequest
模块与include $(CLEAR_VARS)
和include $(BUILD_SHARED_LIBRARY)
包装在一起。
有关详细信息,请参阅您在Android NDK文件夹中找到的docs/PREBUILTS.html
部分(看起来像this)。