본문 바로가기

JNI

기존의 C 라이브러리를 활용하기 위한 JNI의 사용

  1. 자바 파일의 작성
  2. .h 파일을 만듦
    1. javah -classpath ./  -d ./com/indexJNI/header com.indexJNI.IndexJNI
    2. 패키지화된 클래스를 위해 위와 같이 h 파일을 만든다.
  3. c 파일 작성
  4. c 파일 컴파일
    1. gcc -c -fpic indexjni.c
      • indexjni.o 생성
    2. gcc -shared -o libindexjni.so indexjni.o libindex.a
      • libindexjni.so 생성
    3. java.sun.com에 나와 있는 컴파일 소스
      • gcc  -o libnativelib.so -shared -Wl,-soname,libnative.so 
             -I/export/home/jdk1.2/include
             -I/export/home/jdk1.2/include/linux nativelib.c 
             -static -lc
        • -o libnativelib.so : libnativelib.so파일로 생성된다.
          • so파일은 일반적으로 shared object 를 말한다.
        • -shared : shared object 를 생성하기 위한 option이다.
        • -Wl, :  comma뒤에 붙는 옵션을 linker에게 넘겨주기 위한 옵션이다.
        • -soname, : 이 옵션은 일단 무시.
        • -static : dynamic linking 을 지원하는 시스템에서 shared library가 linking되는 것을 막는다.
        • -lc : 이 옵션은 잘 모르겠다.
      • 해야 할 일은 so 라이브러리 파일로 컴파일해서 만들고 libindex.a 파일을 같이 링크시키는 일이다.
        • 그래서 다음과 같이 해봤다.
        • gcc -o libindexjni.so -shared indexjni.c -static -lindex
        • ...안된다.ㅜㅜ
        • 그래서 일단 컴파일부터 하고 링킹을 하기로 했다.
        • gcc -c -fPIC -o libindexjni.o indexjni.c
        • 그 다음 링킹
        • gcc -shared -o libindexjni.so libindexjni.o libindex.a
  5. 실행해보기
    1. Eclipse - project propertys - java build path-libraries-JRE System library - Native library location 에 so파일이 있는 곳을 잡아주고, 실행...되라 제발
    2. ...이런 제길슨 OTL.....지금 새벽 4시...어쩌라고..
ㅣㅏㅣ