안드로이드 Native(NDK) 소스를 간단하게 보는 방법

 안드로이드의 카메라 기능에 대해 알아보고 싶어서 직접 안드로이드 라이브러리 내부에 있는 클래스를 열어 이리저리 해집고 다니다가 다음과 같은 코드를 목격하게 되었습니다.




 JNI를 접해본 경험이 없으신 분들께서는 아마 난생 처음 보는 녀석인 native를 보고 당황하실 분들이 있으시리라 생각합니다.

 JNI란 Java Native Interface의 약자로, 아주 간단하게 설명드리자면 안드로이드를 C/C++로 구현할 수 있는 기능입니다! Java 소스코드는 안드로이드 내에 있는 Dalvic머신(Lolipop 이후부터는 ART)에서 구동됩니다만 안드로이드 폰 내의 센서나 커널 등을 다루게 될 때는 JNI를 통해 C/C++로 접근하여야 합니다.

 위의 경우도 Camera 센서를 구동하기 위해 NDK를 통해 해당 함수가 구현된 것을 native로 나타내고 있다고 볼 수 있습니다. 그렇다면 이 Native 코드는 직접 볼 수 있는걸까요?



 가장 확실한 방법은 안드로이드의 OS 커널을 직접 다운받아 해당 소스코드를 직접 찾아보는 방법입니다. 커널은 위 사이트에서 다운로드 하실 수 있습니다.


http://source.android.com/source/downloading.html


 하지만 커널을 직접 구경할 일이 없는 분들께 이 방법은 번거롭기만 합니다. 게다가 자신이 원하는 소스코드를 바로 찾는 것도 상당히 불편합니다. 그렇다면 좀 더 편하게 안드로이드 native 소스코드를 볼 수 잇는 방법은 없는걸까요?


 

 위 사이트는 안드로이드 OS에 있는 Android와 Kernel의 소스코드를 인터넷으로 볼 수 있도록 되어 있습니다. 검색 기능을 제공하고 있어 자신이 찾고자 하는 소스코드를 더 쉽게 찾을 수 있습니다.


http://androidxref.com/


 위 사이트에 접속하신 후 자신이 보고자 하는 안드로이드 버전을 클릭합니다. 여기서는 현 시점에서 최신버전인 Lolipop을 선택하였습니다.




 검색하기 원하는 버전을 선택하신 후 위 사진에서 붉은 네모칸으로 표시한 'select all'을 선택하신 후 왼쪽 'Full Search' 부분에 자신이 찾고자 하는 native 함수명을 입력합니다.



 다음과 같이 해당 함수명을 가지고 있는 소스코드들이 검색에 잡히는 것을 확인하실 수 있습니다. 해당 함수가 존재하는 소스코드는 다음과 같이 찾으실 수 있습니다.


 Java 소스코드에 있는 native 함수가 있는 클래스의 패지명이 소스코드의 명칭이 될 경우가 대부분입니다. 예를들어 Camera.java가 위치한 패키지는 android.hardware.Camera입니다. 즉, jni 내부의 소스코드의 명칭은 android_hardware_camera.cpp가 해당 코드라고 할 수 있습니다.



 Native 소스코드 내의 함수명은 '클래스의 패키지경로_함수명()'으로 구성되어 있습니다. 즉 android.hardware.Camera 클래스 내에 있는 native 함수인 native_setup 함수는 해당 소스코드 내에서는 

'android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, ...)'

와 같은 형식으로 구성되어 있음을 확인하실 수 있습니다.

  • 2016.12.14 11:25 ADDR 수정/삭제 답글

    비밀댓글입니다

    • Justin T. 2016.12.14 11:30 신고 수정/삭제

      죄송합니다. 비밀댓글에는 답변을 드리지 않습니다.
      그리고 해당 포스트와 관련없는 이야기의 경우 방명록을 이용해주시기 바랍니다.