Programing/Android

안드로이드 - JNI

안중환 2015. 12. 23. 13:57
  • JNI? Java Native Interface로 안드로이드 프레임워크에서 C/C++과 자바 레이어가 유기적으로 동작하게 만들려면 자바 레이어(상위)와 C/C++ 레이어(하위)를 상호 연결해 주는 매개체가 필요하다. 그림 4-1의 좌측과 같이 자바와 C/C++ 모듈 간의 인터페이스를 가능하게 해주는 것이 바로 JNI(Java Native Interface)이다.






    : JNI는 일반적으로 다음과 같은 경우에 주로 활용한다.
    : 안드로이드 SDK를 토대로 만든 안드로이드 애플리케이션은 달빅 가상 머신(Dalvik Virtual Machine) 위에서 동작하는 자바 기반의 프로그램이다. 때문에 C/C++로 생성한 애플리케이션에 비해 느린 실행 속도 등 자바가 지닌 여러 한계를 그대로 가지고 있다. 가령, 그래픽픽 처리나 시그널 프로세싱처럼 CPU의 처리 속도가 중요한 부분에서는 자바보다 C/C++ 같은 네이티브 코드로 작성한 모듈이 훨씬 더 나은 성능을 낼 것이다.
    : SDK(Software Development Kit), NDK(Native Development Kit)

    - 빠른 처리 속도를 요구하는 루틴 작성
     : 대개 자바는 네티이브 코드(C/C++등)에 비해 느리다. 따라서 빠른 처리 속도를 요하는 부분은 C/C++로 작성하고 이를 JNI를 통해 자바에서 호출하는 방법으로 속도 향상을 꾀할 수 있다.

    - 하드웨어 제어
     : 하드웨어 제어 코드를 C로 작성한 다음 JNI를 통해 자바 레이어와 연결하면 자바에서도 하드웨어 제어가 가능하다.

    - 기존 C/C++ 프로그램의 재사용
     : 이미 기존 코드가 대부분 C/C++로 작성돼 있다면 굳이 자바로 동일한 코드를 다시 작성하기보다는 JNI를 통해 기존 코드를 활용할 수 있다.

  • 자바에서 C 라이브러리 함수 호출
    ① 자바 코드 작성
     : 자바 클래스에 네이티브 메서드 선언
     : System.loadLibrary() 메서드를 호출해서 C 라이브러리 로딩
     

    ② 자바 코드 컴파일
    ③ C 헤더 파일 생성
     : 자바 가상 머신에서 함수 매핑 테이블이 필요
     : javah라는 툴을 이용하여 자바 네이티브 메서드와 연결될 수 있는 C 함수의 원형 생성(JNI 네이티브 함수 원형이 포함된 헤더 파일을 생성)
     

      

    ④ C 코드 작성
     : JNI 네이티브 함수 구현

    ⑤ C 공유 라이브러리 생성
     : C 공유 라이브러리 빌드

     자바 프로그램 실행
     : JNI를 통한 네이티브 함수 호출
       


  • C 프로그램에서 자바 클래스 실행하기
    C/C++에서 Java의 클래스를 이용하기 위해서는 Reflection 기술을 이용해야 한다.
     자바 가상 머신에 전달할 옵션값을 생성
     자바 가상 머신 생성
     실행할 클래스 검색 후 로드
    ④ 해당 메서드 ID 획득
    ⑤ 클래스 메서드의 인자로 넘겨줄 객체 생성
    ⑥ 메서드 호출
    ⑦ 자바 가상 머신 소멸


  • 안드로이드 NDK
    : Native Development Kit로 JNI를 활용한 작업을 쉽게 할 수 있도록 구글에서 제공하는 개발 
    도구

    : C/C++ 소스를 네이티브 라이브러리로 빌드하기 위한 도구(컴파일러, 링커 등)
    : 빌드된 네이티브 라이브러리를 안드로이드 패키지 파일(.apk)에 삽입
    : 네이티브 라이브러리 작성 시 안드로이드 플랫폼에서 지원 가능한 시스템 헤더 파일 및 라이브러리
    : NDK 개발 관련 문서, 예제, 튜토리얼
    : 안드로이드에서 동작하는 네이티브 라이브러리는 리눅스용 공유 라이브러리(*.so)로 만들어야 한다. 대다수의 개발자가 윈도 환경에서 안드로이드를 개발하고 있으므로 윈도 환경에서 리눅스 기반의 라이브러리를 빌드하기 위해 Cygwin 필요