这是我第一次使用JNI,也是我第一次必须在C中编写一些行。

我想做的很简单。我只是想使用C例程来切换byte []的字节序。

在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中的byte []吗?还是仅在C调用中进行了修改?

有帮助吗???

谢谢大家!

最佳答案

您可以通过GetByteArrayElements获得jbyte *:

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

重要的是要知道数组的长度:
jsize lengthOfArray = (*env)->GetArrayLength(env, array);

具有jbyte *和length,您可以在c数组中执行所有操作。最后,释放它:
(*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);

07-26 08:48