'JNI'에 해당되는 글 1건
- 2007/06/08 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를 호출 할 것이다.
![]() |
그럼 반대로 JVM의 method를 native code 에서 어떻게 접근할까?
![]() |
JVM 은 native method call 할 때 argument 로 JNI interface pointer를 넘기게 된다. 나중에 보겠지만, 이 pointer로 java 의 다른 collection class 들을 call 할 수 있게 된다.
![]() |
그리고 그림에 대한 설명을 하자면,
Thread 1개 일 때 - VM 에서 생성하는 thread 1개에 JNI 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 object를 keep track 하게 된다. 그리고 native method에서 더 이상 쓰이지 않게 된다면, VM 에다 이 object를 더 이상 쓰지 않는다고 알려주게 된다.




이올린에 북마크하기
Prev
Rss Feed