최종 수정일 : 2019-03-29

안드로이드와 JNI

  • 안드로이드 프레임워크 = C/C++ 기반 모듈 + 자바 기반 모듈
    • 그리고 C/C++ 레이어와 자바 레이어의 모듈 대부분은 밀접하게 연관되어 있다.

GPS를 활용하는 안드로이드 애플리케이션을 예로 보자.
안드로이드 애플리케이션은 GPS 정보를 얻기 위해 애플리케이션 프레임워크의 Location Manager가 제공하는 자바 API를 호출한다.
프레임워크 내부의 GPS 라이브러리를 통해 GPS 디바이스 드라이브에 연결되어 애플리케이션에서 현재 위치 정보 값을 전달해주는 구조로 동작한다.
즉, C/C++ 레이어와 자바 레이어가 서로 상호 작용하며 동작한다.
이를 위해 자바 레이어(상위)와 C/C++ 레이어(하위)를 상호 연결해 주는 매개체가 필요하다. 이것이 JNI(Java Native Interface)다.


JNI(Java Native Interface)

  • JNI : 네이티브 언어(자바 이외의 언어)로 만들어진 모듈이나 애플리케이션과 자바 클래스가 서로 상호작용할 수 있게 정의한 인터페이스이다.
    • 예를 들어, 자바 클래스에서 C 언어로 작성된 라이브러리에 포함된 특정 함수를 사용하거나 반대로 C 프로그램에서 자바 클래스 라이브러리를 사용하고 싶을 때 JNI를 사용한다.

JNI를 활용하는 경우

  1. 빠른 처리 속도를 요구하는 루틴을 작성
    • 자바가 네이티브 언어보다 느리기 때문이다.
  2. 하드웨어 제어
    • 하드웨어 제어 코드를 C로 작성하면 자바에서도 하드웨어 제어가 가능하다.
  3. 기존 C/C++ 프로그램의 재사용

JNI의 필요성

  1. 안드로이드 애플리케이션 개발자 입장
    안드로이드 애플리케이션은 가상 머신 위에서 동작하는 자바 기반 프로그램이다. 따라서 느린 실행 속도를 지닌다. 그래픽 처리나 시그널 프로세싱 같은 경우 C/C++ 같은 네이티브 코드로 작성한 모듈이 훨씬 더 나은 성능을 낼 것이다.
    프로그램 주요 모듈은 자바 개발자가, 성능에 민감한 모듈은 C/C++ 개발자가 작성하여 JNI를 통해 연결하면 성능이 뛰어난 프로그램 개발이 가능하다.
    실제로 안드로이드 애플리케이션 개발자는 안드로이드 SDK(Software Development Kit)를 이용해 자바 기반의 프로그램을 작성한다.
    안드로이드에서 제공하는 NDK(Native Development Kit)를 이용해서 자바 애플리케이션과 연결 가능한 C/C++ 기반의 네이티브 라이브러리를 작성하여 JNI를 사용한다.

  2. 안드로이드 플랫폼 개발자 입장
    안드로이드를 탑재할 장치에 안드로이드 프레임워크에서 지원하지 않는 하드웨어가 설치돼 있는 경우를 생각해보자.
    이 경우 지원하지 않는 장치를 제어하기 위해 디바이스 드라이버를 C 언어로 구현해야 한다.
    C 언어로 드라이버를 구현해도 자바를 사용하는 애플리케이션 개발자가 하드웨어를 이용하기 위해서 C 언어로 구현된 드라이버를 직접 사용할 수 없다.
    따라서 플랫폼 개발자는 하드웨어 제어용 자바 API를 제공해야 한다. 이를 위해 C/C++로 구현된 하드웨어 디바이스 드라이버를 JNI를 이용해 자바 API로 매핑해야 한다.
    이렇게 해야 안드로이드 애플리케이션 개발자는 자바로 작성된 API를 통해 새로 추가된 하드웨어를 사용할 수 있다.