这是我第一次使用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);