IT_Programming/Android_NDK

[NDK] 여러 폴더에 있는 라이브러리 링크하기

JJun ™ 2014. 3. 31. 12:34

 


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


  


프로젝트를 진행하다보면 여러 폴더에 나뉘어 있는 라이브러리를 링크해야 할 일이 생기는데,
NDK 샘플이나 여타의 코드를 보면 전부 한 폴더에 있는 라이브러리만 링크하고 있더군요.

 

저나 제 주변에 NDK나 리눅스 프로그래밍에 대해서 아는 사람이 없었기 때문에 한참을 헤매고 나서야 방법을 알게 되었습니다.
엄청나게 간단한데 구글링으로도 도저히 찾을수가 없더라구요 ㅠ_ㅠ


방법은 아래처럼  LOCAL_LDLIBS 에 원하는 폴더를 모두 적어주면 됩니다.

# libadd.so 는 LibTest1/libs/armeabi 에
# libsubtract.so  는 LibTest2/libs/armeabi 에 있다고 가정합니다.

LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../../LibTest1/libs/armeabi) \
                          -L$(call host-path, $(LOCAL_PATH)/../../LibTest2/libs/armeabi) \
                          -ladd -lsubtract


위와 같이할 경우 한 가지 주의점은 static library 링크는 문제가 없는데 dynamic library 링크는 런타임시에 링크 에러가 발생한다는 것 입니다.

 

dynamic library 링크는 빌드시에 단순한 정보들만을 확인하므로 실제 모듈은 별도로 로딩을 해 주어야 하기 때문이죠.
( System.loadLibrary() 메서드를 사용해서 )


실제로 라이브러리를 사용하는 프로젝트의 $(ProjectDir)/libs/armeabi 폴더는 ndk-build 를 실행하면 모두 삭제되므로, 빌드가 끝난 후
모든 dynamic library 를 $(ProjectDir)/libs/armeabi 폴더로 복사시켜 주면 됩니다. 쉘 스크립트로 자동으로 복사되게끔 하면 편리하겠죠.
(제가 NDK 사용법이나 리눅스 프로그래밍에 대해서 잘 모르기 때문에 이 방법밖에 못 알아냈는데, 혹시 더 좋은 방법 아시는 분은 댓글 부탁드립니다... ^^;;)


아~ 주의할 점이 한 가지 더 있는데, cygwin 콘솔창에서 ndk-build 를 실행하셨다면 이클립스에서 애플리케이션을 실행시키기 전에 반드시 F5 키를 눌러서
프로젝트를 refresh 시켜 주셔야 합니다
. refresh 를 시켜주지 않으면 라이브러리가 변경된 것을 인식하지 못 하더군요.