将C++long类型转换为JNIjlong
Casting a C++ long type to a JNI jlong
我正在使用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);
这是未定义的行为。您正在将一个整数强制转换为指针。它不是指针。您至少需要传递地址。这段代码在大多数平台上都会立即崩溃。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 将C++long类型转换为JNIjlong