Hello JNI
๋งฅ์์ Hello JNI!๋ฅผ ์ถ๋ ฅํ๋ Java ์์ฉํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํด ๋ณด์. ๋จ ์ด ์์ฉํ๋ก๊ทธ๋จ์ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ๋ถ๋ถ์ C++ ๋ก ์์ฑํ ๊ฒ์ด๋ค.
๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ๋ Java ํด๋์ค ์์ฑํ๊ธฐ
$ vi HelloJNI.java
// ์ฃผ์! ํ์ต ํธ์๋ฅผ ์ํด์ ํจํค์ง๋ฅผ ์์ฑํ์ง ์๋๋ค!
class HelloJNI {
private native void print();
public static void main(String[] args) {
new HelloJNI().print();
}
static {
System.loadLibrary("HelloJNI");
}
}
java ์ฝ๋ ํ์ผ์ ์ปดํ์ผํ์ฌ classํ์ผ์ ๋ง๋ ๋ค.
$ javac HelloJNI.java
JNI C++ ํ์ผ์ ๋ง๋ค๊ธฐ ์ํด์ javah๋ฅผ ์ด์ฉํด C++ ํค๋ํ์ผ์ ๋ง๋ ๋ค.
$ javah -jni HelloJNI
๋ง๋ค์ด์ง ํ์ผ์ ํ์ธํด ๋ณด์
$ cat HelloJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
JNI ํจ์๋ช ๊ณผ ์ธ์ํ์ ๋ฑ์ ๊ด๋ จ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค. Java_HelloJNI_print ํจ์๋ฅผ ์์ฑํ๋ค.
$ vi HelloJNI.cpp
#include <jni.h>
#include <iostream>
#include "HelloJNI.h"
JNIEXPORT void JNICALL Java_HelloJNI_print
(
JNIEnv *env,
jobject thiz
)
{
std::cout << "Hello JNI!" << std::endl;
}
HelloJNI ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ jni.h ํ์ผ์ ์์น๋ฅผ ์์์ผ ํ๋ค. ๋งฅ์์๋ ์๋์ ์์น์ ์๋ค.
$ ls /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/
์ปดํ์ผํด ๋ณด์
$ g++ "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/" -c HelloJNI.cpp
์ปดํ์ผํ๋ฉด HelloJNI.o ํ์ผ์ด ์์ฑ๋๋ค. ์ด์ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ช ์ ๋ฐ๋์ lib์ผ๋ก ์์ํด์ผ ํ๊ณ ํ์ฅ์๋ jnilib ์ด์ฌ์ผ ํ๋ค. ์ ์ปดํ์ผ๋ฌธ์์ jni.h๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด jni.h ๊ฐ ์๋ ๊ณณ์ ์ฐพ์์ ์ ์ด์ค์ผ ํ๋ค. ์๋์ฒ๋ผ ์ฌ๋ณผ๋ง ๋งํฌ๋ฅผ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด /System/Library/Java/JavaVirtualMachines/Headers ํด๋๋ฅผ ๋ง๋ ํ ํด๋น ํด๋๋ก ์ด๋ํ ๋ค์ ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h jni.h
$ ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni_md.h jni_md.h
$ g++ -dynamiclib -o libhellojni.jnilib HelloJNI.o
์คํํ๋ค
$ java HelloJNI
Hello JNI!
๋ง์ฝ ์๋์ ๊ฐ์ ๋งํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์คํํ ๋ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ์์น๋ฅผ ์ค์ ํด์ผ ํ๋ค.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloJNI in java.library.path
$ java -Djava.library.path="." HelloJNI
Last updated
Was this helpful?