我在 Java 中有一个 byte[]
,它报告其长度为 256 字节,我将其传递给 C 中的 native 函数。
当我试图从这个数组中取出数据时,结果完全错误,当我打印出来时,它与我在将它传递给 C 之前打印出的数据不匹配。
我尝试了几种访问数据的方法,包括 GetByteArrayRegion
和 GetByteArrayElements
,但似乎没有任何方法提供我期望的数据。
当我调查这个时,我试图查看 JNI 认为 jbyteArray
的长度是什么 GetArrayLength
- 它报告的长度为 1079142960,远远超过我预计 256 字节。此外,每次调用该函数时值都不同,例如另一次 GetArrayLength
返回 1079145720。
这是我用来访问数组的代码:
JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array) {
int length = (*env)->GetArrayLength(env, array);
jbyte data[256];
(*env)->GetByteArrayRegion(env, array, 0, 256, data);
//also tried
//jbyte *data = (jbyte*) (*env)->GetByteArrayElements(env, array, NULL);
}
这看起来很简单,所以我不太确定发生了什么。该数组在 Java 中看起来很好,但它是在 C 中生成并传回的,所以我想可能是那里出了问题,Java 不关心但返回到 C 时会破坏数组。
这是我用来生成数组并将其传回 Java 的代码:
//there is some openSSL stuff here that sets up a pointer to an RSA struct called keys that is size bytes large
jbyteArray result = (*env)->NewByteArray(env, size);
(*env)->SetByteArrayRegion(env, result, 0, size, (jbyte*)keys;
我错过了什么吗?
谢谢
最佳答案
这个函数原型(prototype)不正确:
JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array)
第二个参数是jclass
或jobject
。如果你的方法是静态的,它应该是:
JNIEXPORT jbyteArray function(JNIEnv* env, jclass cls, jbyteArray array)
如果它不是静态的:
JNIEXPORT jbyteArray function(JNIEnv* env, jobject obj, jbyteArray array)
您将类或对象视为一个数组,这解释了您获得的意外结果。
关于java - 在 Android 上通过 jni 将 byte[] 传递给 C 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7049437/