2011년 11월 11일 금요일

[JNI] Java에서 C 호출하기

// HelloJNI.java
class HelloJNI
{
//네이티브 메서드 선언
native void printHello();
native void printString(String str);

// library loading
static { System.loadLibrary("hellojni"); }

public static void main(String args[])
{
HelloJNI myJNI = new HelloJNI();
myJNI.printHello();
myJNI.printString("Hello World from printString fun");
}
}
// 빌드는 아래와 같이 진행
>javac HelloJNI.java
// HelloJNI.class 파일이 생성된다.



// HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printHello
(JNIEnv *, jobject);

/*
* Class: HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printString
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif



// hellojni.c
#include "HelloJNI.h"
#include

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

JNIEXPORT void JNICALL Java_HelloJNI_printString (JNIEnv *env, jobject obj, jstring string)
{
const char *str = (*env)->GetStringUTFChars(env, string, 0);
printf("%s!\n", str);
return;
}


// 빌드는 아래와 같이 진행
>cl -I"D:\MyDevelopment\Android\Java\jdk1.7.0\include" -I"D:\MyDevelopment\Android\Java\jdk1.7.0\include\win32" -LD hellojni.c -Fehellojni.dll
// Fehellojni.dll 파일이 생성된다.




// 빌드가 완료되었으니 이제 실행해보자!
>java HelloJNI
Hello World!
Hello World from printString fun!

// 위 처럼 출력결과가 나타난다.(실행된 코드 그대로 올렸으니 소스상 문제는 없을것이다.)

댓글 없음:

댓글 쓰기