程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> JNA 中的unsigned 類型映射

JNA 中的unsigned 類型映射

編輯:C++入門知識

做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,否則你會發現會覆蓋掉某些數據成員。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved