使用Android NDK将共享库和静态库编译到共享库中

时间:2013-11-04 04:43:28

标签: android android-ndk shared-libraries static-libraries libcurl

我遇到了尝试使用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的教程。

非常感谢任何帮助!

2 个答案:

答案 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)。