1. 라이브러리 만들기
NDK로 개발중 자주 사용하는 부분만 따로 라이브러리화 시키기 위해서 정적 라이브러리 파일 .a를 만드는 방법입니다.
라이브러리화 시킬 소스파일이 있는 폴더에 android.mk 파일을 아래와 같이 작성합니다.
LOCAL_PATH := $(call my-dir) # 제작될 라이브러리(.a) 소스 include $(CLEAR_VARS) # 라이브러리 이름 LOCAL_MODULE := berabue # 라이브러리에 포함될 소스 파일명 LOCAL_SRC_FILES := main.c\ math.c\ struct.c\ include $(BUILD_STATIC_LIBRARY) # 쓰레기 .so 파일로 필수로 작성되어야 합니다 include $(CLEAR_VARS) # 아무것이나 적습니다 LOCAL_MODULE := garbege # 위에 작성한 정적 라이브러리 이름 LOCAL_STATIC_LIBRARIES := berabue include $(BUILD_SHARED_LIBRARY)
android.mk 파일을 위와같이 작성한 뒤 해당 폴더를 빌드(ndk-build)하면
obj -> local -> armeabi 폴더에 '라이브러리이름.a' 파일이 생성됩니다.
해당 라이브러리파일과 소스에 사용되는 헤더파일(.h)을 같이 사용할 프로젝트에 넣으면 됩니다.
2. 라이브러리 링크 후 사용하기
먼저 준비된 라이브러리 파일(.a)과 헤더파일(.h)을 jni 폴더에 복사합니다.
Android.mk 파일을 열어 아래와 같이 수정합니다.
LOCAL_PATH := $(call my-dir) # 미리 준비한 라이브러리 파일 관련 include $(CLEAR_VARS) LOCAL_MODULE := static_berabue # 대충 적으시면 됩니다. LOCAL_SRC_FILES = ./libberabue.a # 준비된 라이브러리 파일명 include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) # 현재 프로젝트 관련 # 제작될 so 파일명 LOCAL_MODULE := curlib # 현재 프로젝트에 사용중인 소스파일명 LOCAL_SRC_FILES := jni-ndk.c\ GLGameRenderer.c\ # 사용하는 라이브러리가 있다면.. 없으면 제거 LOCAL_LDLIBS := -lGLESv1_CM\ -llog\ -ljnigraphics\ # 위에서 적은 모듈명 LOCAL_STATIC_LIBRARIES := static_berabue include $(BUILD_SHARED_LIBRARY)
작성이 완료되었으면 ndk-build를 해봅니다.
오류가 없다면 so 파일이 생성되어있습니다.
이런식으로 A.a파일을 만들었는데 나중에 B.a와 합해서 C.a를 만들어서 C.a만 사용하고자 합니다.
어떻게 만들어야 하나요?
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := A
LOCAL_SRC_FILES := A.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := B
LOCAL_SRC_FILES := B.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_LDLIBS := A B
LOCAL_MODULE := C
include $(BUILD_STATIC_LIBRARY)
이렇게 만들었더니 A.a와 B.a가 포함되지 않습니다. ㅠㅠ
.a 의 장점 :
-- 아카이브로 되어 있어서 구현부 소스를 숨길 수 있다.
-- 미리 빌드를 하였기 때문에 빌드 시간을 줄 일 수 있다.
-- 보안상 타인에게 건네줄때 활용
.a 의 단점 :
-- 사용시 빌드했을때와 다른 툴체인이라면 좃된다
-- 소스가 없으므로 확장을 못한다
-- .a 만 있고 .h 가 없을경우 무용지물이다. (가끔 이럴때가 있음)