Подтвердить что ты не робот

Передача байта [] в Java на функцию в C через JNI: как использовать jarraybyte

Впервые я использую JNI, а также первый раз, когда мне нужно написать некоторые строки в C.

То, что я пытаюсь сделать, очень просто. Я просто пытаюсь переключить endiannes byte [] с помощью подпрограммы 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? Другой вопрос: когда эта процедура закончится... будет ли байт [] изменен в java? Или это только изменено внутри вызова C?

Любая помощь???

Спасибо всем!

4b9b3361

Ответ 1

вы можете получить jbyte * по GetByteArrayElements:

jbyte* bufferPtr = (*env)->GetByteArrayElements(env, array, NULL);

И важно знать длину массива:

jsize lengthOfArray = (*env)->GetArrayLength(env, array);

Имея jbyte * и длину, вы можете делать все вещи в c-массиве. Наконец, выпустив его:

(*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);

Ответ 2

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