Search code examples
javaccryptographyjava-native-interfacegmp

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. These numbers are communicated via a Java program (the C file is called through JNI). I need those large numbers to be returned to the Java program. Now, data types are different mpz_t and BigInteger, so which native data type should be used?


Solution

  • C part.

    #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.

    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.