2010-12-17 3 views
0

JNI를 사용하는 java에서 C API를 사용하려고합니다. 나는 C 프로그래머가 아니에요 ... 여기 char * tab [10]을 java 객체 (JNI)로 변환

은 C "개체"입니다 나는 변환해야합니다 : 숯불 [10]

먼저, 나는 그것이 무엇을 의미하는지 잘 모르겠어요 탭 * : 그것입니다 char 탭에 대한 포인터 또는 char에 대한 포인터 탭? (그리고 어떤 차이가 있습니까?).

그런 다음 해당 Java 객체는 무엇입니까?

답변

0

char * tab [10]은 char 배열 (첫 번째 요소의 점)에 대한 포인터입니다. 여기

는 JNI API입니다 : JNI는 jchar이다에서 " C의 문자"에 대한 http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html

유형에 해당 - 그것은 "문자"원시 타입 자바; "C chars"의 배열을 사용하여 수행 할 수있는 작업은 다음과 같습니다. existand into String 객체를 java 또는 Java 원시 char 배열로 복사합니다. 유용한 링크 : http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html#array_operations

제 2 방법은 5 월입니다은 다음과 같습니다

당신이 JNI 호출에 자바 문자 배열을 전달하거나 새로운 < 원초적> 배열와 C 코드에서 새로운 자바 배열을 만들 기능. 그러나 당신은 자바에서 배열에 대한 포인터로 끝날 것입니다. 그들은 자바의 하나로 C의 문자를 복사 jEnv는

jEnv->ReleaseCharArrayElements(javaCharArray, C_CharArray, JNI_COMMIT); 

곳 - 자바 환경은 JNI 호출을 통해 전달합니다. 경우에 u 포인터를 가지고 * C_CharArray처럼 역 참조해야 할 수도 있습니다. 그게 효과가있을 것 같아.

+1

잘못되었습니다.'tab'은 10 개의 문자 배열에 대한 포인터가 아니며, char에 대한 10 개의 포인터 배열입니다. – psmears

0

는 10 개 문자열 (대부분) 배열 등으로 직접 모델링 할 것입니다 :

그것은 또한 문자 버퍼의 배열의 가능성, 그래서 당신이 대신 StringBuilder을 사용할 수 있습니다
String[] tab = new String[10]; 

String. Java 배열은 그 자체로 객체이며 정보가 유형에 연결되지 않도록 크기를 알고 있습니다 (C와는 달리 배열 크기는 유형 특성 임).

JNI를 통해 유형/값을 직접 전송할 것으로 기대하지 않습니다. 거기에 변환 글루 코드가 필요합니다.