日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JNA模拟复杂的C类型——Java映射char*、int*、float*、double*

發布時間:2023/12/31 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNA模拟复杂的C类型——Java映射char*、int*、float*、double* 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 引言
  • Java/Native Type Conversions
  • Java和C基本類型指針對應關系
  • Pointer的具體用法

引言

最近項目在用Java調用C寫的一些三方庫,沒辦法直接調,用Java封裝一下C的接口,這就少不了要用到JNA的知識。
關于JNA相關概念介紹參考一位博主的文章JNA結構體的使用。這里主要分享一些比較復雜的類型之間的映射關系。

Java/Native Type Conversions

官方給出的映射關系如下

理論上,對于枚舉類型的指針,Java中可以使用Pointer傳參。

Java和C基本類型指針對應關系

C類型Java類型
char*ByteByReference或Pointer
int*IntByReference或Pointer
float*FloatByReference或Pointer
double*DoubleByReference或Pointer

建議使用對應的ByReference對象替代Pointer,使用Pointer有時可能會得到一個垃圾值(正常情況下兩種方式結果一樣),如果C中函數執行失敗時沒有對指針的值進行處理,使用Pointer就會得到一個垃圾值。下面是一個例子:

// test.h extern "C"{ int testPointer(int a,int* b); } // test.cpp int testPointer(int a, int *b){if (a<0){return -1; // 未對b進行處理 } *b = a;return 0; }

使用ByReference和Pointer兩種方式調用結果:

可以看出,使用Pointer獲取指針中的值時,函數返回-1獲取的值是一個垃圾值,因為C函數沒有對指針進行處理。而使用ByReference對象獲取的值則是0(Java中int的默認值),除非你明確知道C函數不管返回何值都對指針的值做了處理,可以使用Pointer,否則請使用ByReference引用對象,避免獲取到垃圾值。

Pointer的具體用法

假設有如下的C函數:

int get_int_value(int a,int* b);

用于計算a*10,保存到b中輸出。a為負數時函數返回-1,正數返回0。
在Java中使用JNA調用為:

int size = Native.getNativeSize(Integer.class); // 獲取int類型在內存中需要的空間大小,float、double用法與此類似 System.out.println("size="+size);// 為Pointer開辟int類型需要的內存空間(模擬C中int*) Pointer p = new Memory(size); //p.setInt(0,0); // 給pointer設置值。第一個參數為在內存中的偏移量(一般為0),第二個參數為設置的值 int res = CLibrary.INSTANCE.get_int_value(-3,p); // 調用C函數 System.out.println("res="+res); System.out.println("result is:"+p.getInt(0)); // 獲取Pointer中保存的int類型值res = CLibrary.INSTANCE.get_int_value(6,p); System.out.println("res="+res); System.out.println("result is:"+p.getInt(0));

以上就是JNA中如何去模擬C的基本數據類型的指針了,后面會繼續介紹Java如何模擬結構體、結構體指針及結構體中嵌套結構體數組的用法。

總結

以上是生活随笔為你收集整理的JNA模拟复杂的C类型——Java映射char*、int*、float*、double*的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。