我正在开发一个 Cryptographic 项目,其中生成了几个 1024 位数字(在 C 中使用GMP )。这些数字通过 Java 程序进行通信(通过 JNI 调用 C 文件)。我需要将这些大数字返回给 Java 程序。现在,数据类型不同了mpz_t
,BigInteger
那么应该使用哪种原生数据类型呢?
问问题
699 次
2 回答
2
jbyteArray
因为BigInteger
可以对 Java进行序列化和反序列化,byte[]
并且mpz_t
可以对没有标头的结构进行序列化和反序列化,该结构似乎是相同的字节序列。
于 2013-11-09T22:03:09.497 回答
1
C部分。
#include <jni.h>
jbyteArray array(mpz_t *m) {
const size_t size = sizeof (mpz_t);
jbyteArray jbytes = (*env)->NewByteArray(env, (jsize) size);
if (result != NULL) {
jbyte *cbytes = (*env)->GetByteArrayElements(env, result, NULL);
if (cbytes != NULL) {
int i;
for (i = (int) (size - 1); i >= 0; i--) {
cbytes[i] = (jbyte) (*m & 0xFF);
*m >>= 8;
}
(*env)->ReleaseByteArrayElements(env, result, cbytes, 0);
}
}
return result;
}
JNIEXPORT jbyteArray JNICALL Java_Test_bytes(JNIEnv *env, jclass cls) {
mpz_t *m = getSome();
return array(m);
}
Java 部分。
static native byte[] bytes();
static BigInteger bigInteger() {
final byte[] bytes = bytes();
return bytes == null ? null : new BigInteger(1, bytes);
}
请注意,第一个参数1
表示正数signum
。
于 2015-06-06T03:29:48.447 回答