JNI 패키지 컴파일 예제



 본 예제는 JNI 를 사용하였을 때 패키지에서의 컴파일 방법을 설명한 예제이다.

참조 : http://lng1982.tistory.com/153 패키지 컴파일 방법.
참조 : http://buedt.tistory.com/50  패키지 안에서 JNI 활용하기 (일반 방법하고 다르다.)

  * 소스 작성 : ~/simple-test/HelloJni

com.HelloWorld.java   -> com 폴더 안에 HelloWorld.java  JNI 모듈이다.
package com;

public class HelloWorld {
public HelloWorld (){
System.loadLibrary("HelloWorld");
}
public native void printHelloWorld();
}
  
com.main.java   -> com 폴더 안에 main.java    JNI 모듈을 사용할 메인 함수이다.
package com;

public class main {
public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
hw.printHelloWorld();
}
}

  
  

  JNI 모듈을 헤더파일로 변경

javac ./com/HelloWorld.java
javah -cp ./ com.HelloWorld



  * javah 로 작성된 com_HelloWorld.h

com_HelloWorld.h    -> 요거는 com 폴더 안에 있는 것이 아니라 컴파일 루트에 있다.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_HelloWorld */

#ifndef _Included_com_HelloWorld
#define _Included_com_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_HelloWorld
* Method: printHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_HelloWorld_printHelloWorld
(JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

  * com_HelloWorld.h 에 맞춰서 작성한 .cpp 클래스

HelloWorld.cpp  -> vi HelloWorld.cpp 로 com 폴더 밖에서 작성.
#include <stdio.h>
#include "com_HelloWorld.h"

JNIEXPORT void JNICALL Java_com_HelloWorld_printHelloWorld
(JNIEnv *env, jobject obj){
printf("hi World \n");
return;
}

  동적 라이브러리 생성
gcc -fPIC -g -c -Wall -I /usr/lib/jvm/java-7-openjdk-amd64/include HelloWorld.cpp
gcc -shared -o libHelloWorld.so.1.0.1 HelloWorld.o -lc
ln -s libHelloWorld.so.1.0.1 libHelloWorld.so

  자바 컴파일 및 실행
javac -d . com/*.java
java -cp . com.main


  실행 모습









* 메모리 누수 관련 내용 추가


.cpp 파일에서 jstring param 의 데이터를 쓰고 난 뒤에는

반드시 Release를 해주어야 한다.

이는 jstring 객체 뿐만 아니라 다른  jobject 들도 마찬가지이다.

안 그러면 메모리 누수가 발생한다.



아래는 올바른 예제. 붉은색 글씨가 Get 하고 Release 하는 부분이다.


#include <jni.h>

#include "MessageType.h"

#include <stdio.h>

JNIEXPORT jstring JNICALL Java_MessageType_printMessage(JNIEnv* env, jobject obj, jstring msg) {

   char buf[128];

   const char *str = (*env)->GetStringUTFChars(env, msg, 0);

   printf("%s", str);

   (*env)->ReleaseStringUTFChars(env, msg, str);

   scanf("%s", buf);

   return (*env)->NewStringUTF(env, buf);

} 



출처 : https://rerethink.tistory.com/entry/jni%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%A0%84%EB%8B%AC-%EC%9D%B8%EC%9E%90



'프로그래밍 > JAVA' 카테고리의 다른 글

JDK 버전 충돌이 날 경우 해결 방법  (1) 2016.02.12
Json Parser 라이브러리  (0) 2016.02.12

+ Recent posts