안녕하세요. 안드로이드 ndk 를 공부하는 사람입니다.

 

제가 ui에서 jni를 통하여 c/c++로 간단한 http 통신을 만들고 있는데요. 통신은 curl을 사용하려고합니다.

 

제가 사용하는 환경은 :android NDK 6, 운영체제는 윈도우7 64bit, cygwin 환경입니다.

단지 curl로 통신하기 위하여 libcurl.a를 저에 공유 라이브러리에 포함시켜서 curl 제공 api를 사용하고 싶습니다.

 

소스와 mk는 아래와 같고, curl을 사용하기위한 헤더파일들과 libcurl.a 파일은 전부 프로젝트 디렉토리 밑에 jin/curl/ 에 모두

넣어두었습니다.

 

 

< Curl-libstl.cpp : JNI에서 사용할 c/c++소스 >

 

#define CURL_STATICLIB

#include "com_main_nativeJava.h"
    . . .

#include <curl/curl.h>
#include "../jni/curl/easy.h"
#include "../jni/curl/curl.h"

int main(/*int argc, char *argv[]*/) {
    CURL *curl;
    CURLcode res;
    CURL_RES_DATA resData;

    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resData);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriteFunction);

        if ( (res = curl_easy_perform(curl)) == 0 ) {
            printf("Everything is OK.\n");
            printf("%s\n", resData.response);
        }

        free(resData.response);
        /* always cleanup */
        ///curl_easy_cleanup(curl);

    }

    return 0;
}

< android.mk 파일 >

 

# used curl static library (libcurl.a 파일 이미 제공되는 스택틱 라이브러리 사용함)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_PREBUILT_LIBS:=./curl/libcurl.a
include $(BUILD_MULTI_PREBUILT)

 

#안드로이드 jni 에서 사용하기위한 라이브러리 모듈 생성

include $(CLEAR_VARS)
LOCAL_MODULE    := curl_java
LOCAL_SRC_FILES := curl-libstl.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/jni

LOCAL_LDLIBS := -L$(SYSTOOR)/user/lib -llog

LOCAL_STATIC_LIBRARIES := curl
LOCAL_CFLAGS  := -DCONFIG_EMBEDDED\
          -DUSE_IND_THREAD\

include $(BUILD_SHARED_LIBRARY)

 

 

< 결과 >

이렇게 하고 빌드를 하면은 아래와 같이 나옵니다.

 

$ ndk-build
Android NDK: WARNING: Rebuilding STLport libraries from sources!
Android NDK: You might want to use $NDK/build/tools/build-stlport.sh
Android NDK: in order to build prebuilt versions to speed up your builds!
make: /cygdrive/d/temp/testcurl/obj/local/armeabi/libstlport_static.a <- /cygdrive/d/temp/testcurl/obj/local/armeabi/libstlport_static.a 상호 의존성은 무시됩니다.
SharedLibrary  : libcurl_java.so
D:/temp/testcurl/obj/local/armeabi/objs/curl_java/curl-libstl.o: In function `main':
D:/temp/testcurl/jni/curl-libstl.cpp:68: undefined reference to `curl_easy_init'
D:/temp/testcurl/jni/curl-libstl.cpp:75: undefined reference to `curl_easy_setopt'
D:/temp/testcurl/jni/curl-libstl.cpp:76: undefined reference to `curl_easy_setopt'
D:/temp/testcurl/jni/curl-libstl.cpp:77: undefined reference to `curl_easy_setopt'
D:/temp/testcurl/jni/curl-libstl.cpp:79: undefined reference to `curl_easy_perform'

collect2: ld returned 1 exit status
/cygdrive/c/android-ndk-r6/build/core/build-binary.mk:280: recipe for target `/cygdrive/d/temp/testcurl/obj/local/armeabi/libcurl_java.so' failed
make: *** [/cygdrive/d/temp/testcurl/obj/local/armeabi/libcurl_java.so] Error 1

 

 

현재 4일째 삽질중인데요. 구글링과 여러 사이트를 뒤져 보아도 100% 명확한 해결이나 curl 관련 NDK  샘플이 없네요.

정말 안드로이드의 로우레벨단에서 curl 사용하기가 이렇게 힘든줄은 몰랐습니다.

 

끝까지 읽어주셔서 감사합니다.

좋은 하루되십시오.