设为首页 加入收藏

TOP

JNA 中的unsigned 类型映射
2014-11-23 17:50:04 来源: 作者: 【 】 浏览:4
Tags:JNA unsigned 类型 映射

做JNA的时候遇到了unsigned int如何映射的问题,因为java中没有unsigned 类型,还在想要不要就用普通的int型,然后最后取abs一下


尝试了一下,发现最后返回的值不对。


DLL中的代码如下:


[cpp]
unsigned int add(unsigned int first,unsigned int second) {
printf("(c) test jna : %u + %u = %u\n", first, second, first + second);
return first + second;
}

unsigned int add(unsigned int first,unsigned int second) {
printf("(c) test jna : %u + %u = %u\n", first, second, first + second);
return first + second;
}
jna调用如下:


[cpp]
int a=0x80000000;
int b=0x70000000;
int c=(TestJnaLib.INSTANCE.add(a, b));

//c=c& 0xffffffffl;
System.out.println("a+b="+c+" ");

int a=0x80000000;
int b=0x70000000;
int c=(TestJnaLib.INSTANCE.add(a, b));

//c=c& 0xffffffffl;
System.out.println("a+b="+c+" ");
结果如下所示:
a+b=-268435456
(c) test jna : 2147483648 + 1879048192 = 4026531840


改为c=Math.abs(c);

a+b=268435456


答案依然是错误的,想想也是,本来就是32位,一位用去做符号位了,直接取正数,会丢失原有的数据,因为符号位没了。

上网一查之后,发现使用long来代替unsigned int,但是有问题时,long是64位,如果直接代替了必然会出错。

经过测试,在JNA中add函数应该这样声明:


[java]
int add(int first, int second);
long add(int first, int second);

int add(int first, int second);
long add(int first, int second);
两种都可以,但是感觉第二中由于long是64位,应该会覆盖掉栈中的数据,但是调用成功,很是不解,但是推荐使用第一种,这样在DLL中运行代码没有问题,当如果需要取值的时候,应该这样取:


[java]
int a=0x80000000;
int b=0x60000000;
System.out.println(a+" "+b+" ");
long c=(TestJnaLib.INSTANCE.add(b, a));
long d=a+b;
d=d& 0xffffffffl;
c=c& 0xffffffffl;
System.out.println("a+b="+c+" ");
System.out.println("d:"+d+" ");

int a=0x80000000;
int b=0x60000000;
System.out.println(a+" "+b+" ");
long c=(TestJnaLib.INSTANCE.add(b, a));
long d=a+b;
d=d& 0xffffffffl;
c=c& 0xffffffffl;
System.out.println("a+b="+c+" ");
System.out.println("d:"+d+" ");
一定要用long类型通过&操作符来把低32位取出来。通过对比d,两者是相同的,说明这种方法是对的。

在结构体中如果出现了unsigned int型,一定用int来代替,而不是long,否则你会发现会覆盖掉某些数据成员。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ new 的工作过程 下一篇HDU 2089 不要62

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·请问c语言刚入门,该 (2025-12-26 10:21:04)
·python 编程怎么定义 (2025-12-26 10:21:01)
·09-指 针 (一)-c语言 (2025-12-26 10:20:58)
·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)