简体   繁体   English

Java本机接口:长整数的数据类型

[英]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_tBigInteger ,那么应该使用哪种本机数据类型?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM