我在Java语言中有一个byte[]
,它报告它的长度为256字节,我将其传递给C语言的本机函数。
当我试图从这个数组中获取数据时,它是完全错误的,当我打印出它时,它与我将其传递给C之前打印出的数据不匹配。
我尝试了几种访问数据的方法,包括GetByteArrayRegion
和GetByteArrayElements
,但似乎都没有给出我想要的数据。
当我调查这个的时候,我试着看看JNI认为GetArrayLength
的jbyteArray
的长度是多少-它报告的长度是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;
我是不是遗漏了什么?
谢谢
发布于 2011-08-13 11:52:34
此函数原型不正确:
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)
您将类或对象视为数组,这解释了您获得的意外结果。
发布于 2011-08-13 11:28:55
我认为主要问题是强制将OpenSSL结构转换为字节数组。随着时间的推移,这个结构很可能会被释放。这就解释了当你返回到C语言时,报告给你的奇怪和不同的长度。给Java生成一个RSA*
也不会对你有多大的帮助-- Java对这个特殊的结构一无所知,也无法识别它。
你应该尝试的是使用一个
这取决于您是只想将公钥信息传递给Java (see also here),还是同时将私有信息传递给Java。这样,您就可以确保从一开始就处理字节数组。
一旦这对您起作用了(使用您已经尝试过的技术),回到Java,您就可以将字节数组解析成有意义的东西。在公钥的情况下,这很简单:对数组使用X509EncodedKeySpec,并使用KeyFactory#generatePublic生成公钥。
在私钥的情况下,事情稍微复杂一些。OpenSSL只理解PKCS#8 format,而默认情况下,Java按照PKCS#1格式对其私钥进行编码。但是您已经可以使用i2d_PKCS8PrivateKey_bio将密钥转换为PKCS#8。不过,您需要首先将RSA*
包装为EVP_PKEY*
:
EVP_pkey *pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);
不要加密您的密钥并使用in-memory BIO
,然后将生成的字节数组传递给Java,并在那里传递给PKCS8EncodedKeySpec
的构造函数,最后使用KeyFactory
生成您的私钥。
发布于 2011-08-13 09:09:38
请尝试在字符串后追加'\0‘字符。可能它不能识别字符串的结尾。
https://stackoverflow.com/questions/7049437
复制相似问题