티스토리 툴바

NDK 및 JNI 기본 개념

Operating Systems/Android 2010/08/26 11:50 Posted by viiiin

기본적으로 NDK와 JNI의 기본 개념에 대해 알아보는 이유는, 안드로이드 App을 개발하는데 있어서 Java뿐만 아니라 C/C++ 언어를 사용하기 위함입니다.

NDK : Native Development Kit

NDK는 JAVA의 JNI 기술을 이용하여 안드로이드 App(Java)과 안드로이드 Library(C/C++) 계층을 연결해주는 역할을 합니다.

JVM에서 C/C++과 같은 언어로 구현된 것을 네이티브 함수(네이티브 메소드)라 합니다. JDK는 표준 프로그래밍 인터페이스인 JNI를 지원합니다. 즉, JVM에서 C/C++ 코드를 다소 이식성 있게 호출할 수 있습니다.

JNI 기본 : 네이티브 메소드(Native method)란 자바에서 특화된 메소드로써, 다른 언어로 구현되어 있으며 native 라는 예약어를 가지는 메소드를 말합니다.

■ 네이티브 메소드를 이용하는 몇 가지 공통적인 이유

1. 이미 다른 언어로 상당히 크고 중요한 코드를 작성했고, 자바로 동일한 코드를 재작성하기를 원치 않으며, 단지 기존 코드를 재사용하고 싶을 때 JNI를 사용합니다.

2. 우리가 시스템 디바이스에 접근할 필요가 있거나 혹은 자바의 성능을 넘어선 플랫폼 특정적인 작업을 수행할 경우에 JNI를 사용할 수 있습니다. 사실 많은 자바 라이브러리 루틴들이 결과적으로는 내부(private) 네이티브 메소드를 이러한 목적으로 호출하고 있습니다. 예를 들면, I/O, threading, networking 패키지들 전부가 내부 네이티브 메소드를 포함합니다.

3. 자바로 구현하기엔 어플리케이션이 매우 느릴 수 있으며, C++에서 time-critical 코드를 구현함으로써 성능의 향상을 가져올 수 있을 경우에 JNI를 사용합니다.

■ JNI의 부정적인 부분

1. 이식성(portability)을 잃게 됩니다. 많은 자바 라이브러리가 네이티브 메소드를 사용하고 있는데, 새로 추가된 네이티브 메소드가 모든 플랫폼에서 호출 가능한 동일한 C++ 코드를 가진다면, 그 코드는 자바에서 가장 먼저(in the first palce) 구현되어질 수 있습니다.

2.안정성(safety)를 잃게 됩니다. 네이티브 메소드는 자바 메소드처럼 동일한 보호를 보장받지 못합니다. 일단 C++ 코드에 들어가게 되면, 자바에서의 모든 것이 백지화 되고, 메모리 추적, 포인터의 사용, 그리고 배열 바운딩에 의한 C++ 버그들이 발생할 수 있습니다.

3. 네이티브 메소드의 구현은 .dll 및 .so와 같은 동적 라이브러리들 내에서 이루어집니다. 네이티브 메소드를 사용하는 자바 코드는 반드시 동적 라이브러리들을 호출하는데, 이는 자바 시큐리티 매니저에 반대되는 연산입니다. 일례로 애플릿에서는 일반적으로 사용자 정의 네이티브 메소드를 호출할 수 없습니다.

4. 코드 자체가 방해물이 될 수 있습니다. 타이핑 오류와 같은 컴파일 오류에 종종 직면하게 됩니다.

■ JNI를 사용하는 기본 절차

1. 예약어 native 를 표시함으로써 자바로 구현되지 않는 특정 메소드들을 가지는 자바 클래스를 선언합니다.

2. JNI 프로토콜을 사용하여 네이티브 메소드를 구현하는 C/C++ 함수를 작성합니다.

3. C/C++ 함수를 컴파일하고 동적 라이브러리에 삽입합니다.

4. JVM이 동적 라이브러리를 호출합니다. 네이티브 메소드에 대한 호출은 동적 라이브러리 내에서 구현된 호출에 의해 다루어집니다.

다음 포스팅에는 실제 NDK를 이용하여 안드로이드 App을 만드는 간단한 예제를 만들어 보도록 하겠습니다.
수고하셨습니다. ^^

<참고 자료>
[1] Mark Allen Weiss, C++ for Java Programmers - "JNI:JAVA와 C++의 연동"



저작자 표시 비영리 동일 조건 변경 허락

'Operating Systems > Android' 카테고리의 다른 글

VMware에 Live Android OS 실행하기  (0) 2010/09/02
JNI 헤더파일 - jni.h  (0) 2010/08/30
NDK를 이용한 안드로이드 App 기본예제  (6) 2010/08/26
NDK 및 JNI 기본 개념  (4) 2010/08/26
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. dd 2011/12/12 01:40  댓글주소  수정/삭제  댓글쓰기

    구글링하다 보게 됬네요 jni 와 ndk가 정확히 어떤 차이인지 헷갈려서 이리저리 돌다가 발견했는데 정말 많은 도움 됬습니다 수고하십쇼

    • viiiin 2012/01/08 22:20  댓글주소  수정/삭제

      도움이 되었다니 오히려 제가 감사하네요. ^^;
      다른 곳에 있는 걸 정리해 놓은 것 뿐인데요.

  2. 블루피쉬 2013/04/08 14:18  댓글주소  수정/삭제  댓글쓰기

    감사합니다. ndk를 이해하는데 많은 도움이 됬습니다.