안녕하세요. 안드로이드 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 사용하기가 이렇게 힘든줄은 몰랐습니다.
끝까지 읽어주셔서 감사합니다.
좋은 하루되십시오.




스스로 해결했습니다.
인터넷으로 뒤져서 찾은 대부분의 android.mk 내용은 절대 동작이 안된다는 것을 알았습니다...
툴체인 빌드 환경을 통하여 제공되는 mk파일을 이용하면 간단히 해결됩니다.
인터넷으로 mk 파일 내부에 $ (call import-module~ 이런것을 추가해라든지... static으로 만들고 하라는 이야기들 전부는...
다 안되는 거짓정보입니다... 인터넷으로 제대로 된 정보가 없는 이유를 이제야 알겠네요...