Android NDK

Developer/Android 2014. 11. 24. 01:51

NDK

NDK는 구글에서 자바를 활용하면서 C/C++로 이미 구현된 많은 라이브러리를 활용 가능할 수 있도록 배포한 Native Development Kit이다. 이때 자바와 네이티브 라이브러리의 연결은 JNI를 사용한다. NDK와 JNI는 Dalvik VM과 Java VM에서의 자바와 C/C++간의 연결을 해주는 역할을 한다. 


NDK에서 제공하는 라이브러리

libc, libm, JNI interface header, libz, liblog, OpenGL 1.x libjnigraphics, STL


JNII
JNI (Java Native Interface)는 자바 프로그램에서 해당 플렛폼의 네이티브 코드에 접근하려고 만든 인터페이스이다. 

자바에서 native 키워드를 사용한 함수를 네이티브 라이브러리와 연결한다. 또한 네이티브 라이브러리에서 자바의 변수나 메서드에 접근할 수도 있다. 

 

JNI 구현 순서

1. 자바 코드작성

2. javac로 소스를 컴파일해 class 파일을 얻음

3. javadh로 class파일에서 헤더 파일 생성

4. 생성된 헤더파일을 토대로 C/C++ 코드 작성

5. C/C++코드를 컴파일해 Shared Object 라이브러리 생성

6. 안드로이드 자바 애플리케이션에 라이브러리를 포함하여 APK를 완성


자바 코드

package com.example.hellojni;

import android.app.Activity;

import android.widget.TextView;

import android.os.Bundle;



public class HelloJni extends Activity

{

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        TextView  tv = new TextView(this);

        tv.setText( stringFromJNI() );

        setContentView(tv);

    }


    public native String  stringFromJNI();


    public native String  unimplementedStringFromJNI();


    static {

        System.loadLibrary("hello-jni");

    }

}

자바 코드를 작성 할때 라이브러리와 연결하고자 하는 함수는 native키워드로 지정한다.

Dalvik VM이 어플리케이션을 실행할 때 native 키워드로 선언되어 있는 부분을 포함된 라이브러리의 symbol 테이블을 검사하여 해당 함수를 동작시킨다. 


네이티브 코드

#include <string.h>

#include <jni.h>


jstring

Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )

{

#if defined(__arm__)

  #if defined(__ARM_ARCH_7A__)

    #if defined(__ARM_NEON__)

      #define ABI "armeabi-v7a/NEON"

    #else

      #define ABI "armeabi-v7a"

    #endif

  #else

   #define ABI "armeabi"

  #endif

#elif defined(__i386__)

   #define ABI "x86"

#elif defined(__mips__)

   #define ABI "mips"

#else

   #define ABI "unknown"

#endif


    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");

}

 

자바에서 네이티브 코드로 접근하기 위해서는 JNI 규약에 맞춰 헤더파일을 만들어야 한다. 헤더의 함수 형태는 JNIEXPORT <함수타입> JNICALL Java_<패키지명>_<클래스명>_<함수명>과 같이 표현해야한다. 

'Developer > Android' 카테고리의 다른 글

Android 권한관리  (0) 2018.10.14
안드로이드 Makefile (NDK)  (2) 2014.12.08
Eclipse ADT 플러그인 없이 안드로이드 프로젝트 생성 & 빌드하기  (0) 2014.10.08
Android MediaPlayer  (0) 2014.07.30
Fragment  (0) 2014.07.10
Posted by No names
,