gpt4 book ai didi

java - 通过 JNI : how to use jarraybyte 将 Java 中的 byte[] 传递给 C 中的函数

转载 作者:IT老高 更新时间:2023-10-28 21:00:29 35 4
gpt4 key购买 nike

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

关于java - 通过 JNI : how to use jarraybyte 将 Java 中的 byte[] 传递给 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3421300/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com