通过 JNI 将 Java 中的 byte[] 传递给 C 中的函数:如何使用 jarraybyte

2022-09-01 06:36:56

这是我第一次使用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中的byte[]会被修改吗?还是只在C调用中修改?

任何帮助???

谢谢大家!


答案 1

你可以通过GetByteArrayElements获得jbyte*:

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


推荐