将Java中的byte 传递给C到JNI中的函数:如何使用jarraybyte

这是我第一次使用JNI,也是我第一次用C语言编写一些行。

我想做的很简单。 我只是尝试使用C例程切换byte []的endiannes。

在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中的byte []会被修改吗? 或者它只在C调用内修改?

任何帮助???

感谢大家!

你可以通过GetByteArrayElements得到jbyte *:

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

知道数组的长度很重要:

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

拥有jbyte *和length,你可以用c-array做所有的事情。 最后,发布它:

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

qrtt给了你很好的答案。

但是,JNI具有非常全面且(相对)易于理解的文档,如果您将来再次使用JNIfunction,则应该从前面阅读。 你可以在这里找到它: 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