通过 JNI 将 Java 中的 byte[] 传递给 C 中的函数:如何使用 jarraybyte [英] Passing a byte[] in Java to a function in C through JNI: how to use jarraybyte

查看:18
本文介绍了通过 JNI 将 Java 中的 byte[] 传递给 C 中的函数:如何使用 jarraybyte的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

This is the first time that I use the JNI and also the first time that I have to write some lines in C.

What I am trying to do is very simple. I'm just trying to switch the endiannes of a byte[] using a C routine.

In java it is done like this:

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;
        }
}

So to do this using JNI, I've tried to imlpement the same routine in the JNICALL, but it doesn't compile. What I've written so far is this:

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;
    }
}

I have no clue how to use the jbyteArray type of data. is it possible to store a jbyte in a char??? Another question is.. when this routine is over...will the byte[] in java be modified?? Or is it only modified inside the C call?

Any help???

Thanks to everybody!

解决方案

you can get jbyte* by GetByteArrayElements:

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

And it is important to know the length of your array:

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

Having jbyte* and length, you can do all the things in c-array. Finally, releasing it:

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

这篇关于通过 JNI 将 Java 中的 byte[] 传递给 C 中的函数:如何使用 jarraybyte的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆