티스토리 뷰
반응형
JNI가 뭔지 궁금해서 6년전쯤 윈도우에서 dll를 만들고 자바에서 호출한 적 있었는데
최근에 다시 해 볼 일이 있어서 자료를 찾던 중에 좋은 소스가 있어서 소개해 드립니다.
다른 부분은 자료도 많고 해서 패스.
핵심인 C 구현부인데요.자바에서 문자열을 넘겨주고 (jstring jstr)
다시 자바로 문자열을 리턴하는 함수 입니다.
색칠한 부분이 소스의 핵심입니다.
JNIEnv 와 jobject를 이용하면 자바의 클래스변수, 생성자, 함수 모두에 접근할 수가 있더군요.
EXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring jstr)
{
2. JVM 옵셤을 사용해서
ex) java -Djava.library.path=경로 클래스명
* 라리브러리명은 libxxxx.so 형태로 하고 로드할때는 xxx 명만 주면 된다. 즉 접두어 lib와 확장자 .so 는 넣지 않음.
* Thread 환경에서 호출되어질 경우, 아래 1, 2번은 각각 자바와 C 구현부에서 처리하는 방법임.
1. JAVA CODE
synchronized(obj) {
}
2. JNI CODE
if((*env)->MonitorEnter(env, obj) != JNI_OK) return NULL;
if((*env)->MonitorExit(env, obj) != JNI_OK) return NULL;
** 64bit로 컴파일하고 java로 실행할 경우 -d64 옵션을 주어야한다.
ex) java -d64 xxx
* 솔라리스에서 라이브러리 32bit/64bit 확인
최근에 다시 해 볼 일이 있어서 자료를 찾던 중에 좋은 소스가 있어서 소개해 드립니다.
다른 부분은 자료도 많고 해서 패스.
핵심인 C 구현부인데요.자바에서 문자열을 넘겨주고 (jstring jstr)
다시 자바로 문자열을 리턴하는 함수 입니다.
색칠한 부분이 소스의 핵심입니다.
JNIEnv 와 jobject를 이용하면 자바의 클래스변수, 생성자, 함수 모두에 접근할 수가 있더군요.
EXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring jstr)
{
char buf[128];
const jbyte *str;
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return NULL; /* OutOfMemoryError already thrown */
}
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
/* We assume here that the user does not type more than
* 127 characters */
scanf("%s", buf);
return (*env)->NewStringUTF(env, buf); // java의 new String() 과 같음
const jbyte *str;
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return NULL; /* OutOfMemoryError already thrown */
}
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
/* We assume here that the user does not type more than
* 127 characters */
scanf("%s", buf);
return (*env)->NewStringUTF(env, buf); // java의 new String() 과 같음
}
* UNIX에서 .so 파일 사용시 라이브러리 인식 방법
1. $LD_LIBRARY_PATH 위치에 넣어 둔다. 보통 /usr/lib
* UNIX에서 .so 파일 사용시 라이브러리 인식 방법
1. $LD_LIBRARY_PATH 위치에 넣어 둔다. 보통 /usr/lib
------------------------------------------
In Solaris, libraries live in 32-bit : /usr/lib 64-bit : /usr/lib/64
------------------------------------------
2. JVM 옵셤을 사용해서
ex) java -Djava.library.path=경로 클래스명
* 라리브러리명은 libxxxx.so 형태로 하고 로드할때는 xxx 명만 주면 된다. 즉 접두어 lib와 확장자 .so 는 넣지 않음.
* Thread 환경에서 호출되어질 경우, 아래 1, 2번은 각각 자바와 C 구현부에서 처리하는 방법임.
1. JAVA CODE
synchronized(obj) {
}
2. JNI CODE
if((*env)->MonitorEnter(env, obj) != JNI_OK) return NULL;
if((*env)->MonitorExit(env, obj) != JNI_OK) return NULL;
** 64bit로 컴파일하고 java로 실행할 경우 -d64 옵션을 주어야한다.
ex) java -d64 xxx
* 솔라리스에서 라이브러리 32bit/64bit 확인
--> file 파일명
------------------------------- ps -------------------------------
위처럼 Java에서 String 객체로 C로 넘겨주면 문자셋의 영향으로 C에서의 호환이 안될때가
있습니다. Java는 기본으로 유니코드를 사용하고 C에서는 보통 ksc5601를 사용하기 때문이죠.
C에서 문자셋을 변환하는 것은 많이 번거롭습니다.
때문에 자바에서 유니코드를 -> ksc5601로 변환한 후에 byte[] 배열로 c로 넘겨주면 됩니다.
다시 받을 때도 byte[]로 받아서 문자셋을 변환해 주면 되겠죠.
--- eof ---
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코라나 19
- 유가바이트디비
- 화분벌레
- Pixel Pals
- 톡토기
- 파나소닉 비데 DL-EH10KWS
- GKRS
- 카카오 에드
- weka
- Sybase IQ
- yugabyteDB
- 솔리드 쿨론
- 브리다 정수기
- Life Chair
- 루미큐브 종류
- 배당급
- 증권정보포털
- 별이 빚나는 밤
- 별잉 빛나는 밤
- JMW 헤어드라이기기
- node.js
- 홈 오피스
- 남설 팔찌
- 오미크론
- 고체 향수
- 로니카 BCS
- 매직 트랙패드2
- 르세라핌
- VARIDESK
- 빈센트 반 고흐
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함