在Android上将byte []通过jni传递给C的问题

Car*_*den 8 c java java-native-interface android openssl

我有一个byte[]Java,它将其长度报告为256字节,我将其传递给C中的本机函数.

当我试图从这个数组中获取数据时,这是完全错误的,当我将其打印出来时,它与我在将其传递给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);
}
Run Code Online (Sandbox Code Playgroud)

这看起来非常简单,所以我不确定发生了什么.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;
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

谢谢

oli*_*erg 12

这个函数原型是不正确的:

JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array)
Run Code Online (Sandbox Code Playgroud)

第二个参数是a jclass或a jobject.如果您的方法是静态的,它应该是:

JNIEXPORT jbyteArray function(JNIEnv* env, jclass cls, jbyteArray array)
Run Code Online (Sandbox Code Playgroud)

如果它不是静态的:

JNIEXPORT jbyteArray function(JNIEnv* env, jobject obj, jbyteArray array)
Run Code Online (Sandbox Code Playgroud)

您将类或对象视为数组,这可以解释您获得的意外结果.