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)
您将类或对象视为数组,这可以解释您获得的意外结果.
归档时间: |
|
查看次数: |
9245 次 |
最近记录: |