将C++long类型转换为JNIjlong

Casting a C++ long type to a JNI jlong

本文关键字:JNIjlong 类型转换 C++long      更新时间:2023-10-16

我正在使用JNI在C++和Java之间传递数据。我需要通过一个"长"类型,并且正在使用类似的东西来完成

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

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

当您传递一个jlong(64位(作为指针(很可能是32位(时,您必然会丢失数据。我不确定惯例是什么,但试试这个:

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

或者这个:

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

...A方法采用一个jvalue数组,而无后缀方法采用与标量Java类型等价的C。

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

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

在一些奇特的CPU架构上,jlong变量和jvalue并集的对齐要求可能不同。当您显式声明一个并集时,编译器会处理它。

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

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

这是未定义的行为。您正在将一个整数强制转换为指针。它不是指针。您至少需要传递地址。这段代码在大多数平台上都会立即崩溃。