java - 在 Android 上通过 jni 将 byte[] 传递给 C 时出现问题

标签 java android c java-native-interface openssl

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

当我试图从这个数组中取出数据时,结果完全错误,当我打印出来时,它与我在将它传递给 C 之前打印出的数据不匹配。

我尝试了几种访问数据的方法,包括 GetByteArrayRegionGetByteArrayElements,但似乎没有任何方法提供我期望的数据。

当我调查这个时,我试图查看 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)

第二个参数是jclassjobject。如果你的方法是静态的,它应该是:

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/

相关文章:

c - C 中函数意外返回

c++ - 是否有工具可以在定义的开关下剥离代码?

java - 通用编程和Java double

android - 如何知道我的应用程序已从设备上卸载...?

android - Android应用APK中HACKED-META-INF文件夹的用途是什么

android - 重启 CursorLoader 不反射(reflect)数据库删除

c - log2 在 C 中导致 STM32F4 MCU 出现故障

java - 使用 Ant 运行 JUnit 批处理文件时出现 "Unable to write log file"错误

java - HttpUrl连接 : Get response body from non 200 OK

java - 我需要获取一个字符串并输出该字符串中出现次数最多的单词