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基本類型指針對應關系
| 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調用為:
以上就是JNA中如何去模擬C的基本數據類型的指針了,后面會繼續介紹Java如何模擬結構體、結構體指針及結構體中嵌套結構體數組的用法。
總結
以上是生活随笔為你收集整理的JNA模拟复杂的C类型——Java映射char*、int*、float*、double*的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外文参考文献去哪找和下载?
- 下一篇: 基于ADS仿真的465khz检波电路