Java Native Interface


새로운 언어에 익숙해 진다는건 참으로 어렵다. 연휴에 비가 너무 많이와서 곳곳에 피해가 많아 걱정이다. 비가 온 관계로 아이들을 데리고 어디 놀러가지 않은 까닭에 책을 보고 인터넷을 뒤져볼 시간이 좀 되었다.
그렇지만 답을 찾기위해 신경쓰다가 머리가 쥐가 날 지경이다. 자바는 왜이리 환경설정이 어려운 걸까?

루씬에 한글 처리 모듈을 붙이기 위해 형태소 분석기나 색인어 추출기를 자바언어로 다시 코딩해야 한다면, 아마도 자바로된 루씬을 이용한 검색엔진 개발은 포기하는게 나을것이다.
자바로 된 형태소분석기가 있다고 들은 적도 없거니와 설령 코딩할 수 있다고 하더라도 자바로 코딩할 사람이 얼마나 되겠는가? 안그래도 자바는 느리다고 말하는 판에..

다행히 자바는 다른 컴파일러언어를 지원하기 위해 JNI(Java Native Interface)를 제공한다.
따라서 흔희들 C나 C++에서 쉽게 포팅가능하다고 한다. 따라서 C나 C++로 된 관련자료들은 인터넷에 꽤 있는거 같다.

나는 델파이를 즐겨사용하는데(오래전에 만든 색인어 추출기를 가지고 있다) 다행히 인터넷에서 델파이 관련 자료도 찾을 수 있다. 델파이용 JNI라이브러리를 컨버팅한 샘플이 존재한다.
Using the Java Native Interface with Delphi
http://www.pacifier.com/~mmead/jni/delphi/
http://www.delphi-jedi.org/APILIBRARY:1675904772

다행은 다행인데 이거 이클립스에서 사용하기가 만만찮다.
샘플을 가지고 자바로 컴파일된 클래스를 가지고 라이브러리를 링크시켜보면 잘 되는데 패키지명만 들어가면 안된다.
그렇다고 내가 자바에 많이 익숙해 지거나, 혹은 패키지단위로 프로그램되는 이클립스를 버린다고 생각하면 또다시 하늘이 노래진다.
도대체 언제 테스트 하고 프로그램 한단 말인가?
게다가 한글처리를 버린다는 것은 좋은 검색서비스를 기대할 수 없기에 반쪽짜리 서비스를 만드는 것과 같다.
들리는 얘기처럼 루씬을 하는 여러 개발자 마냥 루씬에서 이용가능한 형태소분석기가 나오기를 기다리는 것도 아주 짜증나는 일이다. 내가 루씬을 해야할 이유가 없다. 그럴바에야 그냥 기존 엔진을 고쳐쓰겠다.
(루씬이 활성화 되면 자바에 지원되는 형태소분석모듈이나 API들이 공개, 혹은 저가로 여러개 나오길 기대한다.)

델파이 + JNI에 대해 많은 스트레스용 삽질과 검색중에 다행히 package클래스에서 JNI를 이용하는데 성공했다.
모든 것이 그러하듯이 모를땐 지옥같더니 알고나면 너무나 간단하고 어이없는 것이다.
Package클래스에서의 JNI사용
http://blog.naver.com/elfapril/120012185540

혹 델파이(카이릭스)로 JNI를 쓰고자 하는 분들은 exports에 사용되는 함수명에 패키지명도 함께 써야 한다는 사실만 명심하면 된다.^^
즉, 자바명_패키지명_클래스명_프로시져명;  Java_javadelphi_HelloWorld_displayHelloWorld;

이걸 해결하고 나니 이런젠장
또 한글문제가 걸린다.
자바의 스트링형인 JString형이 한글에서 안맞는것이다. 다행이 이것은 JString형이 UTF형인것을 착안하여 몇번의 삽질끝에 해결할 수 있었다.
자바로 부터 받은 JString을 String으로 변환시킨후 UTF8->String으로 변환하면 한글로,
다시 이 한글을 자바로 리턴할때는 UTF8로 변환시키면 자바와 델파이에서 제대로 된 한글처리가 가능하다.


이제 겨우 루씬을 통한 인덱싱을 위한 대략적인 설계와 코드 둘러보기가 끝났다. 코딩하는 일만 남았다..
금주에는 시간이 빡빡한데 진도가 나갈수 있으려나 모르겠다.

다음은 델파이용 샘플을 그냥 올리는 것이다.

//
package javadelphi;

public class HelloWorld {

   public native String ParseNoun(String text);
   static
   {
             System.loadLibrary("GruMrpJniImpl");
   }
}


//
package javadelphi;

public class Main {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
     System.out.println(System.getProperty("java.library.path"));//dll이 copy되어야 할 library path 확인
     HelloWorld hw = new HelloWorld();
     String val = "삼성전자";
     System.out.println(val);
     String str =  hw.ParseNoun(val) ;
     System.out.println(str);
 }

}

///

library GruMrpJniImpl;


uses
  SysUtils,
  Classes,
  JNI;

                         
function Java_javadelphi_HelloWorld_ParseNoun(PEnv: PJNIEnv; Obj: JObject; Value: JString): JString; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
  Str, sWords: string;
  JVM: TJNIEnv;
  i : Integer;
begin
    // Create an instance of the Java environment
  JVM := TJNIEnv.Create(PEnv);
  try       // Convert the JString into a string
    Str := Utf8ToAnsi(JVM.JStringToString(Value));
   
      // Print the string to the screen
    Writeln('In Native code, string is: ' + Str );

      // Create a new string and return it
    Result := JVM.NewStringUTF(PAnsiChar('String from Native code ' + AnsiToUtf8(Str)));
   
  finally
     JVM.Free;
  end;
end;


exports
  Java_javadelphi_HelloWorld_ParseNoun,

end.

by typos | 2006/07/17 21:26 | 루씬 접목기 | 트랙백 | 덧글(3)
트랙백 주소 : http://lucene.egloos.com/tb/1371806
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 홍태바리 at 2007/01/30 01:05
지금 만들구 계신거에 도움이 좀 되어야할텐데 ㅡ,.ㅡ; 에거~
Commented by typos at 2007/01/30 02:19
느려터진 자바로 형태소 분석기를 어떻게 만드냐고 한탄하던 내가 6개월이 지난 지금 직접 코딩하고 있으니 ㅋㅋㅋ.. 자바도 쓸만하니 아직 포기 않고, 좀 느려도 없는것 보다는 나으니 써야하고 ㅎㅎ
Commented by togel at 2016/02/25 12:34

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >