[英]Java Native Interface: data type of long integers
I am working on a Cryptographic project, where several 1024 bit numbers (using GMP in C) are generated. 我正在研究一个加密项目,其中生成了几个1024位数字(在C中使用GMP )。 These numbers are communicated via a Java program (the C file is called through JNI).
这些数字通过Java程序进行通信(C文件通过JNI调用)。 I need those large numbers to be returned to the Java program.
我需要将那些大数返回给Java程序。 Now, data types are different
mpz_t
and BigInteger
, so which native data type should be used? 现在,数据类型是不同的
mpz_t
和BigInteger
,那么应该使用哪种本机数据类型?
jbyteArray
因为BigInteger
可以序列化和反序列化到Java byte[]
而mpz_t
可以序列化和反序列化到/没有结构(似乎没有头),好像它是相同的字节序列。
C part. 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 part. Java部分。
static native byte[] bytes();
static BigInteger bigInteger() {
final byte[] bytes = bytes();
return bytes == null ? null : new BigInteger(1, bytes);
}
Note that the first argument 1
means a positive signum
. 请注意,第一个参数
1
表示了积极的signum
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.