Передача байта [] в Java функции в C через JNI: как использовать jarraybyte - PullRequest
32 голосов
/ 06 августа 2010

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

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

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

Ответы [ 2 ]

50 голосов
/ 03 ноября 2010

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

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

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

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

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

(*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);
8 голосов
/ 23 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...