본문 바로가기

프로그래밍/Android

JNI 기본사항

자바측 소스 구성

  1. 라이브러리 로드 : 네이티브 코드로 작성된 라이브러리를 동적으로 로드한다. 당연한 말이지만 네이티브 메쏘드를 호출하기전에 로드해야 한다.
System.loadLibrary("native_library");

객체 생성시 처리해도 되고, static 블럭을 사용해 로드되도록 할 수 있다.

public class TestClass {
   static {
      System.loadLibrary("native_library");
   }
}

 

  1. native 메쏘드 선언 : 클래스의 멤버로 메쏘드를 선언한다. 이때, native 키워드를 통해 이 메쏘드는 외부 네이티브 코드에 연결됨을 알린다.
public native void nativeMethodName();

 

C 측 소스 구성

일단 헤더 파일이 필요한데, 이건 임의로 구성하는게 아닌 java에서 제공하는 툴을 사용해 구성한다.

  1. 헤더파일 생성
> javah -jin TestClass

이 명령은 위에서 작성한 java TestClass를 기반으로 C에서 사용할 헤더를 생성해 준다.
TestClass.h 파일이 생성되고, native로 선언된 메쏘드의 export 정보가 삽입된다.

JNIEXPORT void JNICALL Java_TestClass_nativeMethodName( JNIEnv*, jobject);

 

  1. 메쏘드 구현

위 헤더를 include 하고, 해당 함수를 구현하면 된다.

#include "TestClass.h"

JNIEXPORT void JNICALL Java_Testclass_nativeMethodName( JNIEnv *env, jobject obj )
{
   return;
}

 

  1. 소스빌드

jin.h 가 존재하는 jdk 의 include 경로를 연결해서 빌드한다.

> gcc -c -I"/Library/java/Home/include -o MyClass.o MyClass.c

 

  1. def 생성
    dll은 메쏘드를 export 하기 위한 정보를 def 파일에 작성한다.
    이파일은 dll을 생성할때 컴파일러가 참조하게 된다. export 할 메쏘드명을 적어주면 된다.

MyClass.def
EXPORT
Java_TestClass_nativeMethodName

 

  1. dll 생성
    > gcc -shared -o native_library.dll MyClass.o MyClsss.def

윈도우즈 환경에서는 win32 dll 프로젝트로 생성하고, jdk 의 include 디렉토리를
프로젝트에 포함시키면 된다. 혹은 jni.h 를 프로젝트에 포함시키던가~

 

  1. 메쏘드 인자 추가

JNIEnv : JNI에서 제공되는 함수들에 접근하기 위한 포인터
jobject : 메쏘드를 호출한 java 오브젝트에 대한 참조
인자 추가 (리턴도 특별할것 없음)

java
public native void sayHello( int v );

c
JNIEXPORT void JNICALL Java_Hello_sayHello( JNIEnv *, jobject, jint );