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" { } |
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을 참조 한다는 이야기가 되겠다.