文章目录

  • 引言
  • 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*相关推荐

  1. Java基础 -> 从键盘获取不同的输入类型(String,int,double,boolean)(Scanner)

    API类Scanner: java.util 类 Scanner java.lang.Object继承者 java.util.Scanner 可以使用不同的 next 方法将得到的标记转换为不同类型的 ...

  2. java中String与int/float/double/byte/数组

    原文链接:小宁博客[添加链接描述](https://www.sunxiaoning.com/language/634.html) int转换为String(int i=100) 第一种方法:s=i+& ...

  3. C++ int float double类型的数据大小端转化

    以下代码抄自<网络多人游戏架构与编程>,可以支持float.int.double等数据类型数据的大小端转换,测试代码为: void TestByteSwap() {int32_t test ...

  4. JAVA string、int、 double 转换

    1.查看数据类型 a.getClass().toString(); 2.string转int,如果 string中包含空格.包含小数点 会报错 string去掉空格: System.out.print ...

  5. c语言double类型是几字节,c语言中int long float double 等类型所占字节及输出表示(转)...

    16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : 2个字节 float: 4个字节 doub ...

  6. int类型的实参与int*类型的形参不兼容_谁告诉的你们Python是强类型语言!站出来,保证不打你!...

    1. 真的能用隐式类型转换作为强弱类型的判断标准吗?最近有些学员问我,Python到底是强类型语言,还是弱类型语言.我就直接脱口而出:Python是弱类型语言.没想到有一些学员给我了一些文章,有中文的 ...

  7. C++笔记-使用sprintf把各个类型转成char*(long long, doule,int)

    目录 背景 演示及代码 背景 在某些时候,不能使用其他的框架,只能使用标准的东西,进行操作,这此记录下,方便以后快速敲代码. 这个sprintf在stdio.h的头文件中. 本次有以下类型转成char ...

  8. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化

    hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...

  9. Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系

    [1]常见的映射关系表 常见的映射对应关系如下表所示: Hibernate映射类型 Java类型 标准SQL类型 字节大小 integer/int java.lang.Integer/int INTE ...

  10. 深入解析JNA—模拟C语言结构体

    原帖:http://blog.csdn.net/shendl/article/details/3599849 深入解析JNA-模拟C语言结构体 前言 前几天写<JNA--JNI终结者>一文 ...

最新文章

  1. 博士补贴125万,硕士70万本科21万,浙江某地人才(简直是抢人)新政!
  2. python爬虫中for循环无法每一段输出_1024程序员节送你一套爬虫玩玩
  3. 树莓派AI视觉云台——1.树莓派Pi3简介
  4. Codeforces A - Bear and Prime 100(交互题)
  5. npm 安装报错 rollbackFailedOptional verb npm-session无法解决?
  6. envi中的sg滤波_ENVI滤波
  7. Python(14)-模块
  8. Docker必备知识整理
  9. SPOOLing假脱机技术详细介绍
  10. 测试:fiddler使用
  11. 1秒后跳转页面(延时setTimeout)
  12. 程序编译与代码优化 -- 早期(编译期)优化
  13. Flink状态专题:keyed state和Operator state
  14. 斑能不能彻底去掉_鸡脖、猪脖子上有淋巴结,会有大量毒素、病菌?还能不能放心吃?...
  15. python绘制动态心电图_长时动态心电图ECG数据可视化
  16. 机器学习周志华第三章笔记
  17. (BLE)蓝牙抓包(1) -nRF-sniffer和wireshark
  18. 用CSS实现立方体360度旋转
  19. IIS Express配置使通过IP访问
  20. macbook键盘背光打不开怎么办?如何解决苹果笔记本键盘背光不亮的问题?

热门文章

  1. 使用DevCpp/DevC++调试的设置和步骤
  2. python流量分析_python 监控流量
  3. 超详细!JDK 8 下载、安装和环境配置(macOS 和 Windows 版本)
  4. t470键盘拆解_Thinkpad 二手T470笔记本拆解|支持双硬盘|拆机教程
  5. fanuc系统屏蔽服务器,FANUC伺服轴的屏蔽方法
  6. 研发/项目计划管理表格
  7. 超宽屏幕比例_显示器屏幕比例与分辨率对照表
  8. 一个简单的微信小程序支付demo
  9. 你知道手动探针台系统的用途及组成部分吗?
  10. 我的学习日志11.6