리눅스 & 안드로이드2014. 7. 11. 10:11

얼마전에 Eclipse에서 NDK를 지원한다는 사실을 알게 되었다.
(2014/06/30 - [Linux & Android] - Android NDK에서 C++11 사용하기)

 

그 방법을 이용하면, source가 NDK로 빌드되어 .apk 패키지에 자동으로 .so 라이브러리가 포함되고, system uid가 필요하다거나 하는 특수한 경우가 아니라면, 아무런 문제 없이 잘 실행이 된다.

 

그런데, source가 아닌 binary로 존재하는 .so 라이브러리의 경우에는 어떻게 해야 하는지 잘 몰랐다.

 

처음에는 직감적으로 libs/armeabi (or armeabi-v7a)에 .so 파일을 복사해 두면 될거라고 생각했었는데, 잘 안되어 고민을 했었는데, 결과적으로는 그 방법이 맞았다.

 

즉, .apk에 포함시키고자 하는 .so 라이브러리를 (project root)/libs/armeabi (or armeabi-v7a) 디렉토리를 생성하고 복사 한 후, 프로젝트를 다시 빌드하면 된다.

 

그럼, 이전에는 왜 안됐냐?

 

Android Native Support 옵션을 설정 해 둔게 화근이었다.

 

이것을 설정하면 .cproject라는 파일이 project root에 생성되고, project clean을 수행하면 libs/ 디렉토리에 있는 모든 .so 파일을 삭제하고 다시 빌드를 시도한다. (물론 자동빌드 옵션이 선택 된 경우)

 

그렇다보니 .apk를 새로 생성하려고 project clean을 수행하면 .so 파일이 날아가고, 빌드된 후 복사 해 봐야 아무런 영향이 없었던 것이었다.

 

그냥 bin, gen 폴더만 날리고 다시 빌드를 한다면 Android Native Support 옵션을 설정 해 두었더라도 문제없이 해결이 되지 않았을까 하는 추측을 해 본다. 나중에 확인되면 업데이트를... ; )

 

Posted by 세월의돌

Google code에 android-ndk-profiler가 있고, 설명도 잘 되어 있다.

그런데, 나의 이해력이 부족해서 그런건지 모르겠지만, 애매하게 잘 안되었던 부분들이 있어서 정리한다.

 

 


 

설명에는 다운로드한 압축파일을 $HOME/tools 위치에 해제하고, ndk-build에 NDK_MODULE_PATH를 이용해 경로를 지정하라고 되어 있는데, 나의 경우에는 NEON 사용을 위해 cpufeatures를 추가로 사용하기 때문에 그런건지, 아니면 Windows 환경이라서 그런 것인지는 모르겠지만 빌드 에러가 발생했다.

 

이 문제는 그냥, 아래와 같이 ANDROID NDK가 설치된 경로에 복사해서 해결했다.

 

android-ndk-r9d\sources\android-ndk-profiler

 

 


 

 

그리고 arm-linux-androideabi-grpof를 실행할 때 profiling 한 library를 넘겨주라고 되어 있는데,

 

$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gprof your_lib.so

 

stripped library라고 에러메시지를 뱉어 냈다.

 

평소에는 Eclipse에서 libs/armeabi-v7a/에 생성된 .so 파일만 바라보았기 때문에, 다른 위치에 또 생성이 되는지는 몰랐다.

찾아보니 lib/armeabi-v7a/에 생성되는 .so 파일은 stripped library 이며, 여기에서 필요한 non-stripped library는 obj/local/armeabi-v7a/에 생성된다.

 

알고보니 내가 설명을 자세히 읽지 않았었군...;;

 

Run the gprof tool, passing it the non-stripped library (usually in $PROJECT/obj/local/armeabi-v7a/libXXXX.so or $PROJECT/obj/local/armeabi/libXXXX.so). This is for NDK version r5b onwards, in earlier versions the path to gprof is different but should still work.

 

 


 

 

위의 obj/local/armeabi-v7a/에 생성된 .so 파일을 넘겨주면 결과가 stdout으로 출력되니, 파일로 redirection하여 출력하면 보기 편하다.

 

Posted by 세월의돌