on
Jni관련
SDK와 NDK, 그리고 PDK
SDK
Software Developer’s Kit의 약자로 주로 UI를 기반으로 특화된 API를 제공하여 Application Level에서의 개발을 쉽게 해주며, 기반은 Java Language이다.
따라서 SDK는 일반적인 Android Application 개발에 사용되며, Android Emulator를 내장하고 있어 Build와 동시에 바로 Test까지 가능하다.
( 단, H/W를 직접 사용해야 하는 Application은 Test가 힘들다. )
NDK
Native Developer’s Kit의 약자로,
SDK와 마찬가지로 Application을 개발하는데에 사용되는 Framework이지만 Java 대신에 C/C++ Language를 이용하여 개발할 수 있다.
따라서 NDK는 Application 뿐만 아니라 MiddleWare개발에도 사용되며,
JNI를 통해 SDK에서 Linux에서 사용하던 C/C++을 사용할 수 있게 해준다.
그러므로, HAL( Hardware Abstraction Layer )의 구성/형태에 따라 굉장히 민감할 수 밖에 없다.
결론적으로, 기본적으로 NDK는 JNI용 Library를 만드는 것이나, 약간의 변형을 통해 실행 파일( Executable File )도 만들 수 있다.
다만, 완벽한 형태의 Application의 제작은 NDK만으로는 사실상 불가능하다.
PDK
Platform Developer’s Kit의 약자로, Android의 Porting 개념으로서 SDK와 NDK를 포괄하는 개념이다.
PDK는 반드시 Unix 계열의 OS에서 개발이 이루어져야 하며, Android의 전체 Source Code를 이용하여 개발한다.
결국 PDK는 Linux Kernel Level과 그 바로 위에 위치한 Native Library의 HAL 부분 등 Android의 깊숙한 부분에 대한 개발 방법이다.
따라서 Android의 App 개발이 아닌 Kernel Level, 혹은 Core Frame의 개발이 목적이라면 PDK를 이용해 개발 해야 한다.
JnI
JNI : 네이티브 언어(자바 이외의 언어)로 만들어진 모듈이나 애플리케이션과 자바 클래스가 서로 상호작용할 수 있게 정의한 인터페이스이다.
예를 들어, 자바 클래스에서 C 언어로 작성된 라이브러리에 포함된 특정 함수를 사용하거나 반대로 C 프로그램에서 자바 클래스 라이브러리를 사용하고 싶을 때 JNI를 사용한다.
이점
자바는 가상머신이 필요하기때문에
1.속도가 느리며
2.하드웨어를 제어하기에 부적합
3.다른 코드와의 호환성문제 (코드 재사용 어려움)
등등을 JNI를 통해 해결할수있음.
작동방식
이 섹션에서는 Android용 네이티브 애플리케이션 빌드에 사용되는 기본 구성요소를 소개하고 빌드 및 패키징 프로세스를 설명합니다.
기본 구성요소
앱을 빌드할 때는 다음 구성요소를 잘 파악하고 있어야 합니다.
네이티브 공유 라이브러리: NDK에서는 개발자의 C/C++ 소스 코드에서 이러한 라이브러리 또는 .so 파일을 빌드합니다.
네이티브 정적 라이브러리: NDK에서는 개발자가 다른 라이브러리에 연결할 수 있는 정적 라이브러리 또는 .a 파일을 빌드할 수도 있습니다.
자바 네이티브 인터페이스(JNI): JNI는 자바 및 C++ 구성요소의 상호 통신 채널 역할을 하는 인터페이스입니다. 이 가이드는 JNI 지식을 전제로 합니다. JNI에 대한 자세한 내용은 자바 네이티브 인터페이스 사양을 참조하세요.
애플리케이션 바이너리 인터페이스(ABI): ABI 앱의 기계어 코드가 런타임 시 시스템과 어떻게 상호작용할지를 정확히 정의합니다. NDK는 이 정의에 따라 .so 파일을 빌드합니다. 다양한 ABI는 서로 다른 아키텍처에 대응합니다. 즉, NDK에는 32비트 ARM, AArch64, x86, x86-64용 ABI 지원이 포함되어 있습니다. 자세한 내용은 ABI 관리를 참조하세요.
매니페스트: 자바 구성요소가 없는 앱을 작성하는 경우 매니페스트에 NativeActivity 클래스를 선언해야 합니다. 네이티브 활동 및 애플리케이션의 ‘native_activity.h 인터페이스 사용’에 그 방법이 자세히 설명되어 있습니다.
평가 절차
Android용 네이티브 앱 개발을 위한 일반적인 흐름은 다음과 같습니다.
어떤 부분을 자바로 구현하고 어떤 부분을 네이티브 코드로 구현할지 결정하여 앱을 디자인합니다.
참고: 자바를 완전히 사용하지 않을 수는 있지만 디스플레이와 UI 제어를 비롯한 다양한 작업에 Android 자바 프레임워크가 유용하다는 사실을 알 수 있을 것입니다.
다른 Android 프로젝트에서와 마찬가지로 Android 앱 프로젝트를 만듭니다.
네이티브 전용 앱을 작성하는 경우 AndroidManifest.xml에 NativeActivity 클래스를 선언합니다. 자세한 내용은 네이티브 활동 및 애플리케이션을 참조하세요.
‘JNI’ 디렉터리에 이름, 플래그, 연결된 라이브러리, 컴파일할 소스 파일을 비롯하여 네이티브 라이브러리를 설명하는 Android.mk 파일을 만듭니다.
선택적으로 타겟 ABI, 툴체인, 릴리스/디버그 모드, STL을 구성하는 Application.mk 파일을 만들 수 있습니다. 이들 중 지정하지 않는 각 항목에는 다음 기본값이 사용됩니다.
ABI: 지원이 중단되지 않은 모든 ABI
툴체인: Clang
모드: 릴리스
STL: 시스템
프로젝트의 jni 디렉터리에 네이티브 소스를 넣습니다.
ndk-build를 사용해 네이티브(.so, .a) 라이브러리를 컴파일합니다.
실행 가능한 .dex 파일을 생성하는 자바 구성요소를 빌드합니다.
앱 실행에 필요한 .so, .dex 및 기타 파일을 포함한 모든 항목을 APK 파일에 패키징합니다.