我应该如何在 jna 中将 return unsigned int 按值从 Java 传递到 C/C++
How should I pass and return unsigned int by value from Java to C/C++ in jna
我的 C++ 函数
extern "C" {
DECLSPEC unsigned int STDCALL doNumberThing(unsigned int some_number);
}
我的Java界面
package com.myplace.nativeapi;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
interface NativeAPI extends Library {
int doNumberThing(int some_number);
}
显然,在处理仅对一种或另一种不匹配类型(int 与 unsigned int)有效的值时会出现问题;解决这个问题的推荐方法是什么? One answer elsewhere 推荐 "IntByReference",但除非我误解了,否则他们谈论的是 long*,而不是按值传递的实际 unsigned int。
(这是精简的示例代码,如果有语法错误,请在评论中告诉我,我会更新问题)
JNA provides the IntegerType
class,可用于表示某个特定大小的无符号整数。您必须使用 Java long
来保存原始形式的原生 unsigned int
,因为它的值可能超出 Java int
的范围,但一般来说,您可以绕过 IntegerType
对象,只在需要时拉出原始值。
public class UnsignedInt extends IntegerType {
public UnsignedInt() {
super(4, true);
}
}
我的 C++ 函数
extern "C" {
DECLSPEC unsigned int STDCALL doNumberThing(unsigned int some_number);
}
我的Java界面
package com.myplace.nativeapi;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
interface NativeAPI extends Library {
int doNumberThing(int some_number);
}
显然,在处理仅对一种或另一种不匹配类型(int 与 unsigned int)有效的值时会出现问题;解决这个问题的推荐方法是什么? One answer elsewhere 推荐 "IntByReference",但除非我误解了,否则他们谈论的是 long*,而不是按值传递的实际 unsigned int。
(这是精简的示例代码,如果有语法错误,请在评论中告诉我,我会更新问题)
JNA provides the IntegerType
class,可用于表示某个特定大小的无符号整数。您必须使用 Java long
来保存原始形式的原生 unsigned int
,因为它的值可能超出 Java int
的范围,但一般来说,您可以绕过 IntegerType
对象,只在需要时拉出原始值。
public class UnsignedInt extends IntegerType {
public UnsignedInt() {
super(4, true);
}
}