Jni C 사용 방법

|

javah를 사용하여 C Header File을 생성 하였다면 그 형식은  Package_Class.h 형식이 될 것이다.

File을 open 하면 Source.Java File의 native 뒷부분 정의 된 함수가 Header 로 정의되가 된다.

형식은 

JNIEXPORT jobject JNICALL Java_Package_Class_NativeFunction(JNIEnv *, Java Parameter);


EX) Package : SharedMemory

      Class : MemoryRead

      NativeFunction : Data1(int Index)

JNIEXPORT jobject JNICALL Java_SharedMemory_MemoryRead_Data1(JNIEnv *, jobject, jint);


C Header File에서 정의된 함수를 기준으로 Soucre Code를 작성하여 라이브러리 형식으로 만든뒤 Java에서 Call 하여 사용하는 방식을 취하면 된다.


Source를 제작 하여 컴파일 후 라이브러리로 만든 파일의 위치는 Java Class Package의 상위에 위치시키면 된다.


EX ) Package Class File 위치 = :/JniTest/Package

       C 라이브러리 위치  = :/JniTest


C Source 제작


Jni로 생성된 Header File을 inlucde 하여 Coding 하면 된다.


위 예제를 기준으로 Code를 작성하면


#include "SharedMemory_MemoryRead.h"

JNIEXPORT jobject JNICALL Java_SharedMemory_MemoryRead_Data1
  (JNIEnv *env, jobject obj, jint Index)

{

}


Function 내용은 원하는 걸로 채우면 된다!!

jint Index 의 경우 그냥 int Type과 동일하게 하여 작성해 나가면 된다.


java에서의 사용법


MemoryRead.java


package SharedMemory;


import java.util.ArrayList;


public class MemoryRead{

    native ShmData Data1(int Index);


    static{

        try{

            System.loadLibrary("ShmRead");

        }catch(Exception e)

            e.printStackTrace();

        }

    }


    public ArrayList<ShmData> GetShmData()

    {

        ArrayList<ShmData> Data = new ArrayList<ShmData>();


        for(int i = 0 ; i < MAX_DATA; i++)

        {

            ShmData Tmp = Data1(i);

            Data.add(Tmp);

        }

        return Data;

    }

}


Java Sample Code를 작성하자면 대략 위와 같은 형태가 될 것이다.

여기서 System.loadLibrary("ShmRead"); 라인의 ShmRead는 C로 제작된 라이브러리

libShmRead.so file을 참조 한다는 이야기가 되겠다.




And