엔디케이(NDK)를 이용하는 안드로이드

 How to build JNI Application in Android 기본적으로 안드로이드 앱을 개발하기 위해서는 JAVA를 이용한다. 필요에 응하고, CC++등 JAVA이외의 언어로 코딩하는 빌드 하고 싶은 경우에 NDK(Native Development Kit)을 설치하고 JNI(Java Native Interface)을 통해서 Java와 다른 언어 간 인터페이스를 선언하고 사용하게 된다.Android 스튜디오 2.2 이상부터 새롭게 연동이나 빌드 방법을 변경하여 제공하고 있으며 Android 스튜디오 IDE가 version up 될 때마다 템플릿을 선택하여 설정하는 방법에 약간의 차이가 있다. 최신 안드로이드 스튜디오 3.3.2를 기준으로 기본적으로 제공하는 템플릿에 좀 더 응용하여 앱을 작성하는 예를 보여주고 싶다.

1. 원리-C 및 C++ 코드를 원어민 라이브러리로 컴파일하고 IDE의 내장 빌드 시스템인 Gradle을 사용하여 APK로 패키징할 때 NDK를 이용할 수 있도록 하며, 자바 코드가 자바 네이티브 인터페이스(JNI) 프레임워크를 통해 원어민 라이브러리에 포함된 함수를 호출할 수 있도록 한다.원어민 라이브러리 컴파일을 위한 안드로이드 Studio의 기본적인 기술이다.

NDK를 사용하기 위해서는 SDK Tools 메뉴에서 NDK, CMake, LLDB 항목을 추가 선택하여 다운로드 및 설치한다.

구성요소 선택 및 설치 2. 네이티브 프로젝트 생성 – Android 스튜디오3 이상 버전에서는 네이티브 앱을 위한 템플릿을 제공한다. 이것을 선택하면 디폴트로 libnative-lib.so 라는 CC+코드의 라이브러리 파일을 생성하는 프로젝트가 만들어진다.(참조 사이트:https://codelabs.developers.google.com/codelabs/android-studio-cmake#0)

Native C++ 탬플릿 선택 – 프로젝트 생성이 완료되면 Project 탭에서 cpp 폴더가 생성된 것을 확인할 수 있다. – Main Activity Java 소스에는 native 코드와의 JNI 인터페이스를 위해 다음 코드가 삽입된 것을 확인할 수 있다.

디폴트로 자동 생성된 코드 부분

* native-lib.cpp의 C++ 소스 코드는 자바 소스에 대해 strome JNI(…) 함수와 대응하는 함수가 정의되어 있다. 자바 소스에서 호출하는 함수와 인터페이스되는 네이티브 함수는 다음과 같은 지정된 형식으로 함수명이 되어 있다.extern “C” JNIEXPORT <리턴 타입> JNICALLJava_<패키지명>_<클래스명>_<정의된 메소드명>(JNIEnv *env, jobject instance, <타입>변수1,…)

위의 함수를 생성하기 위해서는 호출하려는 자바 소스에 다음과 같은 형식으로 함수를 쓴다.public native 리턴 타입 함수명 (매개변수, …);

인터페이스 하고 싶은 함수를 선언하자 원형이 정의되지 않았다고 경고등이 왼쪽에 표시되지만 이를 클릭하고 메뉴를 확장하고”Create function Java_…”의 항목을 선택하고 native-lip.cpp에 자동으로 인터페이스 함수의 원형이 생성되도록 한다.

패키지명 : com _ oneman _ he l londk , 클래스 : MainActivity , 함수 : stringFromJNI

*빌드스크립트 파일-cpp폴더에는 CMake빌드스크립트 파일인 CMakeList.txt가 있다 -Java코드로 로드할 수 있도록 libnative-lib.so라는 라이브러리 파일을 작성

* build.gradle (Module: app) – 안드로이드 프로젝트 빌드툴-CMake 빌드툴을 외부 빌드툴로 설정 (필요에 따라 컴파일 옵션 “-std=c+11” 등을 적용할 수 있음)

4. 소스의 추가 응용 및 테스트-프로젝트 생성 시 제공되는 native 함수(string From JNI() 이외에 자신만의 native 함수를 추가해 본다.입력창에서 두 정수값을 입력받아 덧셈을 취하여 출력하는 코드 (입력실장부는 jave code로, 데생할 함수는 c++로 작성한다)

앱 화면 구성

* activity_main.xml – 각 뷰 오브젝트는 지면상 간단히 프로그램에 필요한 id와 화면에 표시되는 텍스트의 속성만을 보여준다. 실제로는 보다 많은 속성이 정의되고 있다.

* 소스 코드 (추가부 – Main Activity.java )

* native-lip.cpp – 새롭게 정의한 함수 public native intget Sum(inta, intb);는 네이티브 코드에서는 다음과 같이 생성된다는 것을 알 수 있다. – / Todo 부분을 삭제하고 실장부를 포함시킨다.