IT

JNI를 통해 Java의 바이트[]를 C의 함수에 전달: jarraybyte 사용 방법

itgroup 2023. 8. 1. 20:28
반응형

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

반응형