'JNI'에 해당되는 글 1건

  1. 2007/06/08 JNI 사용법...
2007/06/08 14:06

JNI 사용법...

출처 : 엠파스 Koosal's 님 블로그

1.     JNI 사용법

 
-------------------------------------------------------------------- 
//Test1.java
class Test1
{
static
{
System.loadLibrary("TestDll");	// JVM 에 등록되어 있는 path 의 dll 을 불러오는 함수이다.
//System.load(“c://winnt//system32//TestDll.dll”);
}
public static void main(String ar[])
{
System.out.println("Hello world from Java");
Test1 t=new Test1();
t.inDll();
}
public native void inDll();
}
--------------------------------------------------------------------
 
 
먼저 native method를 사용하는 java file을 만들자.
이제 void inDll(); 함수가 들어있는 .dll 파일(native code)을 만들어야 한다.
만들 때 TestDll.dll 안에
 
C:>Javah -jni Test1
 
.h 를 만들고, 이 것을 바탕으로 C/C++(native code)를 작성하고, 그것으로 library를 만들면 된다.
 
 
 

2.    궁금증

 
VM 은 어떻게 native method를 접근할 수 있나?
VM이 내부적으로 각 class loader에 대해서 loaded native libraries list 가 있다. 대충 아래 그림의 느낌일 것이다.(불확실하다.^^;) 그러면 이 library 에 가서 알맞은 name mthod를 호출 할 것이다.
 
 
 
그럼 반대로 JVMmethodnative code 에서 어떻게 접근할까?
 
 
JVM native method call 할 때 argument JNI interface pointer를 넘기게 된다. 나중에 보겠지만, pointer java 의 다른 collection class 들을 call 할 수 있게 된다.
 
 
그리고 그림에 대한 설명을 하자면,
 
Thread 1개 일 때 - VM 에서 생성하는 thread 1JNI interface pointer 1가 있다. 그래서 같은 thread 에서 어떤 native method를 부른다고 해도 같은 JNI interface pointer argument 로 넘어갈 것이다.
 
Thread 2개 이상 - 지만 thread 2개가 있다면 같은 native method를 호출한다고 해도 다른 JNI interface pointer argument 로 넘어갈 것이다.
 
 
 
Garbage collector 와 관련해서
native method 에서 object를 사용하게 되면, garbage collector가 그 object를 지워서는 안 된다. 그러므로 JVM native method 로 가는 passed all objectkeep track 하게 된다. 그리고 native method에서 더 이상 쓰이지 않게 된다면, VM 에다 이 object를 더 이상 쓰지 않는다고 알려주게 된다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0