JNA 中的unsigned 类型映射
来源:互联网 发布:淘宝女鞋品牌大全 编辑:程序博客网 时间:2024/05/27 10:43
做JNA的时候遇到了unsigned int如何映射的问题,因为java中没有unsigned 类型,还在想要不要就用普通的int型,然后最后取abs一下
尝试了一下,发现最后返回的值不对。
DLL中的代码如下:
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调用如下:
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函数应该这样声明:
int add(int first, int second);long add(int first, int second);
两种都可以,但是感觉第二中由于long是64位,应该会覆盖掉栈中的数据,但是调用成功,很是不解,但是推荐使用第一种,这样在DLL中运行代码没有问题,当如果需要取值的时候,应该这样取:
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,否则你会发现会覆盖掉某些数据成员。
- JNA 中的unsigned 类型映射
- JNA int*等基本类型的映射关系
- JNA类型映射实例__结构体中包含字符串数组
- 关于JAVA中的JNA
- JAVA中的jna
- 关于JAVA中的JNA
- 分享C语言中的unsigned类型的一道题目
- unsigned int mysql中的unsigned
- JNA编程之二:数据类型映射
- JNA编程之四:直接函数映射
- JNA编程之二:数据类型映射
- JNA编程之四:直接函数映射
- 纠结的unsigned类型
- Java - 处理unsigned类型
- unsigned int类型分析
- size_type是unsigned类型
- Hibernate 映射xml中的属性类型
- Hibernate 映射xml中的属性类型
- JAVA经典算法40题
- MFC中按键禁用后,仍响应点击
- Linux上iptables防火墙的基本应用教程
- OpenCV中cvSplit图像的通道分离
- aidl 传递对象
- JNA 中的unsigned 类型映射
- kernel panic
- 工作中ORACLE操作中遇到的问题和处理方式记录
- WPF Label
- 通过一点找最近线段
- POJ 3436 ACM Computer Factory
- Collections.sort的两种用法
- sizeof的详尽计算结构体字节数方法
- qt-windows-opensource 5.1安装提示"升级访问权限时出现错误“