将C ++ longtypes转换为JNI jlong

我正在使用JNI在C ++和Java之间传递数据。 我需要传递一个'long'types,并且使用类似这样的方法:

long myLongVal = 100; jlong val = (jlong)myLongVal; CallStaticVoidMethod(myClass, "(J)V", (jvalue*)val); 

然而在Java中,当检索'long'参数时,它会被检索为一个非常大的负数。 我究竟做错了什么?

Solutions Collecting From Web of "将C ++ longtypes转换为JNI jlong"

当你传递一个jlong​​(这是64位)作为一个指针(这很可能是32位),你肯定会丢失数据。 我不知道什么是约定,但试试这个:

 CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of! 

或这个:

 CallStaticVoidMethod(myClass, "(J)V", val); 

它是...A采用jvalue数组的方法,no-postfix方法使用C等价物来标量Javatypes。

第一个片段有些不安全; 如果更详细的话,更好的select是:

 jvalue jv; jv.j = val; CallStaticVoidMethodA(myClass, "(J)V", &jv); 

在一些奇特的CPU jlongjlongvariables和jvalue联合的alignment需求可能不同。 当你明确地声明一个联合时,编译器负责这个。

还要注意,C ++ long数据types通常是32位的。 jlong​​是64位,在32位平台上,非标准的C等价物是long long__int64

 CallStaticVoidMethod(myClass, "(J)V", (jvalue*)val); 

这是未定义的行为。 您正在投射整数作为指针。 这不是一个指针。 你至less需要通过地址 。 这个代码会在大多数平台上立即崩溃。