我的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 vs unsigned int)的值时存在问题。有什么推荐的方法来解决这个问题?在另一个答案中,推荐使用“IntByReference”,但除非我误解了,否则他们谈论的是long*,而不是传递的实际unsigned int值。
(这是缩减示例代码,如果有语法错误,请在评论中告诉我,我会更新问题)
extern "C"{...}
,那就不是C++。无论如何,只有一个标签是正确的。而你所说的“标志”是什么意思呢?很可能是符号问题。我不懂Java,但如果它没有无符号类型,你需要为C提供的一位额外的unsigned
比特腾出空间,或者断言该值在另一个方向上永远不为负数。 - too honest for this siteint
而不是unsigned int
,这样就不会出现接口不匹配的情况。试图通过接口不匹配的技巧来解决问题是容易出错的,而且在移植代码时很可能失败。由于Java不支持无符号类型,因此C++代码必须处理转换,而不能依靠接口规范中的魔法转换。 - Peter