JNI를 통해 Java의 바이트[]를 C의 함수에 전달: jarraybyte 사용 방법
제가 JNI를 사용하는 것은 이번이 처음이고 C로 몇 줄을 써야 하는 것도 처음입니다.
제가 하려는 것은 매우 간단합니다.C 루틴을 사용하여 바이트 []의 엔디안을 전환하려고 합니다.
Java에서는 다음과 같이 수행됩니다.
public void switchEndianness(byte[] array){
byte byte1;
byte byte2;
for(int i = 0; i < array.length ; i+=2){
byte1 = array[i];
byte2 = array[i+1];
array[i] = byte2;
array[i+1] = byte1;
}
}
JNI를 사용하여 이 작업을 수행하기 위해 JNICALL에서 동일한 루틴을 구현하려고 했지만 컴파일이 되지 않습니다.제가 지금까지 쓴 것은 다음과 같습니다.
JNIEXPORT void JNICALL Java_CEndianness_switchEndianness(JNIEnv *env, jobject obj, jbyteArray array, jint offset, jint length){
char byte1;
char byte2;
int i;
for(i = offset; i < length ; i+=2){
byte1 = array[i];
byte2 = array[i+1];
array[i] = byte2;
array[i+1] = byte1;
}
}
jbyteArray 유형의 데이터를 사용하는 방법을 모르겠습니다.jbyte를 char에 저장하는 것이 가능합니까?또 다른 질문은..이 일과가 끝나면,자바의 바이트[]가 수정됩니까?아니면 C 통화 안에서만 수정이 되는 건가요?
도와드릴까요?
모두에게 감사합니다!
GetByteArrayElements를 통해 jbyte*를 얻을 수 있습니다.
jbyte* bufferPtr = (*env)->GetByteArrayElements(env, array, NULL);
또한 어레이의 길이를 아는 것이 중요합니다.
jsize lengthOfArray = (*env)->GetArrayLength(env, array);
jbyte*와 길이를 가지면 c-array로 모든 것을 할 수 있습니다.마지막으로 릴리스:
(*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);
qrtt는 당신에게 훌륭한 답변을 주었습니다.
그러나 JNI에는 매우 포괄적이고 (상대적으로) 이해하기 쉬운 설명서가 있으므로 나중에 JNI 기능을 다시 사용할 경우 앞에서 뒤로 읽어야 합니다.http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html 에서 확인할 수 있습니다.
다음은 어레이 관련 섹션입니다. http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp1265
언급URL : https://stackoverflow.com/questions/3421300/passing-a-byte-in-java-to-a-function-in-c-through-jni-how-to-use-jarraybyte
'IT' 카테고리의 다른 글
Spring Webflux에서 JDBC 호출 차단 실행 (0) | 2023.08.01 |
---|---|
Oracle SQL 개발자 색상 코딩 (0) | 2023.08.01 |
$.when.apply($, 일부 어레이)의 역할은 무엇입니까? (0) | 2023.08.01 |
Oracle이 DML 문을 수행하는 동안 전체 테이블을 잠글 것인지 아니면 행만 잠글 것인지 여부 (0) | 2023.08.01 |
고유하지 않은 인덱스를 고유한 인덱스로 변경 (0) | 2023.08.01 |