본문 바로가기

6. With IT/6.2 NDK

NDK-static library빌드 관련...


출처 :  http://mobilism.tistory.com/56 

NDK를 사용하는 예제들을 보면 대부분 dynamic library 를 빌드하는 예제인데요. 간혹, static library 가 필요할 때가 있죠. 그래서 이번에는 static library 빌드하는 방법과 몇 가지 주의할 점을 알아보겠습니다.


static library 빌드하는 기본적인 방법은 $(NDK)/samples/two-libs 예제를 참고하시면 됩니다. two-libs의 메이크 파일은 아래와 같은 내용인데요.

LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)
LOCAL_MODULE    := libtwolib-first                           # static library 이름
LOCAL_SRC_FILES := first.c                                     # static library 에 빌드될 소스 파일
include $(BUILD_STATIC_LIBRARY)                          # static library 빌드

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)
LOCAL_MODULE    := libtwolib-second                     # dynamic library 이름
LOCAL_SRC_FILES := second.c                               # dynamic library 에 빌드될 소스 파일. 빌드할 소스가 없다면 생략될 수 있다.
LOCAL_STATIC_LIBRARIES := libtwolib-first              #  같이 빌드할 static library 이름
include $(BUILD_SHARED_LIBRARY)                         # dynamic library 빌드

위의 내용을 보시면 먼저 static library 를 빌드하고 두 번째로 dynamic library 를 빌드하는 부분으로 나눠져 있는데, 주의점은 아래와 같습니다.

  • static library 만 빌드하더라도 반드시 dynamic library 를 빌드하는 부분이 나와야 합니다.
    • 이 때는 dynamic library 부분의 LOCAL_SRC_FILES 항목이 없어도 됩니다.
  • static library 부분의 코드에는 JNI 관련 코드가 들어가서는 안 됩니다.
    • JNI 관련 코드를 사용하려면 Java 층에서 dynamic library 를 불러들여 사용해야 하기 때문에,  static library 에 들어가게 되면 런타임시 링크 에러가 발생하게 됩니다.
    • 때문에, 일반적인 공통 모듈은 static library 로 빌드하고 JNI 관련 부분은 dynamic library 로 빌드해야 합니다.
  • 빌드 후  dynamic library 파일(.so)은 $(ProjectDir)/libs/armeabi 폴더에 복사되고, static library 파일(.a)은  $(ProjectDir)/obj/local/armeabi 폴더에 그대로 남아 있습니다.

'6. With IT > 6.2 NDK' 카테고리의 다른 글

정적라이브러리 동적라이브러리  (0) 2012.06.16
c에서 java호출(Native to Java)  (2) 2012.03.26
Native to Android  (0) 2012.02.18
android-ndk-r7오류  (0) 2012.02.12
cygwin삭제  (0) 2012.02.11