JNI 한글 문제

java는 기본적으로 UTF-8 인코딩을 사용한다. 자바 소스파일을 UTF-8 형식으로 저장하고, UTF-8로 컴파일 하면 전혀 문제가 없다. UTF-8 컴파일 예시:   javac -encoding utf-8 jni/SHMNative.java jni/AlarmEvent.java 다만 이때에는 c++ 소스에서 UTF-8 기반으로 사용된다. 그런데 만약에 EUC-KR로 변환이 필요하다면 iconv로 이용하면 된다. iconv tutorial을 보고 사용해봤는데, 의외로 잘되지 않았는데 IconvString 이라고 검색해보면 쓰기 좋게 만든 소스가 있다.

JNI C++ 오브젝트 처리하기

지난번에는 간단하게 void와 String을 처리해보았다. 하지만 필드가 20개되는 구조체를 형태를 주고 받을려니 아무래도 Object 형태가 필요하다. 1. 일단 기존의 구조체를 java 클래스로 변경하자. 다음과 같이 간단한 구조체를 사용해보자.

User.java

2. jni에서 User을 인수를 가지는 add 메소드를 추가하자 Dailyon.java

  3. 이전과 비슷한 형태로 main class를 구현하자. JNITest.java

  4. header 파일 생성 javah jni.Dailyon 으로 header 파일을 생성하면 다음과 같이 Java_jni_Dailyon_add 구현되어 있다. 함수명은 패키지명 포함되어 있음을 주의하자.

5. c++ 구현 jni_Dailyon.cpp

  항상 패턴은 GetFieldID, Get****Field 가져오면된다. GetFieldID 3번째 인수는 signature인데 다음과 같다. 대소문자를 구분하고, long 인 경우 J임에 유의하자. 자세한 시그니처는 아래 표를 참조하자. Java VM Type Signatures Type Signature Java Type Z boolean B byte C char S short I int…

JNI in solaris

jni 사용해 본 경험은 android에서 간단하게 테스트 한 정도에 불과했는데, 이번 프로젝트 진행중에 java에서 SHM을 C++ 라이브러리를 이용하기 위해 구현했다. tutorial 형식으로 인터넷에 많이 있지만, 이번에 프로젝트에 적용한 방법을 정리했다. 1. 간단하게 실행할  java 파일을 생성하자. JNITest.java

  2. java에서 C/C++을 호출할 클래스를 생성하자. Dailyon.java

여기에서 C/C++로 호출할 메소드 앞에 native 를 붙여주고, System.loadLibrary(“dailyon”); 로딩할 라이브러리 이름을 지정해준다. unix/linux 계열은 파일명이 libdailyon.so 가 된다. 3. javac Dailyon.java 만들 파일을 컴파일 하고 4. javah Dailyon 위와 같이 해주면 Dailyon.h 파일이 생성된다. Dailyon.h

  5. Dailyon.cpp 파일 작성 위에서 만들어진 파일 기반으로 c/cpp 파일을 작성하자. Dailyon.cpp

  Java_dailyon_hello 인수와 리턴형 void 이기 때문에 크게 문제가 없고, Java_dailyon_bye 스트링으로 인수를 받고, int 형으로 리턴한다. 따라서 jstring 받은 형태를 char…