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*相关推荐
- Java基础 -> 从键盘获取不同的输入类型(String,int,double,boolean)(Scanner)
API类Scanner: java.util 类 Scanner java.lang.Object继承者 java.util.Scanner 可以使用不同的 next 方法将得到的标记转换为不同类型的 ...
- java中String与int/float/double/byte/数组
原文链接:小宁博客[添加链接描述](https://www.sunxiaoning.com/language/634.html) int转换为String(int i=100) 第一种方法:s=i+& ...
- C++ int float double类型的数据大小端转化
以下代码抄自<网络多人游戏架构与编程>,可以支持float.int.double等数据类型数据的大小端转换,测试代码为: void TestByteSwap() {int32_t test ...
- JAVA string、int、 double 转换
1.查看数据类型 a.getClass().toString(); 2.string转int,如果 string中包含空格.包含小数点 会报错 string去掉空格: System.out.print ...
- c语言double类型是几字节,c语言中int long float double 等类型所占字节及输出表示(转)...
16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : 2个字节 float: 4个字节 doub ...
- int类型的实参与int*类型的形参不兼容_谁告诉的你们Python是强类型语言!站出来,保证不打你!...
1. 真的能用隐式类型转换作为强弱类型的判断标准吗?最近有些学员问我,Python到底是强类型语言,还是弱类型语言.我就直接脱口而出:Python是弱类型语言.没想到有一些学员给我了一些文章,有中文的 ...
- C++笔记-使用sprintf把各个类型转成char*(long long, doule,int)
目录 背景 演示及代码 背景 在某些时候,不能使用其他的框架,只能使用标准的东西,进行操作,这此记录下,方便以后快速敲代码. 这个sprintf在stdio.h的头文件中. 本次有以下类型转成char ...
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
[1]常见的映射关系表 常见的映射对应关系如下表所示: Hibernate映射类型 Java类型 标准SQL类型 字节大小 integer/int java.lang.Integer/int INTE ...
- 深入解析JNA—模拟C语言结构体
原帖:http://blog.csdn.net/shendl/article/details/3599849 深入解析JNA-模拟C语言结构体 前言 前几天写<JNA--JNI终结者>一文 ...
最新文章
- 博士补贴125万,硕士70万本科21万,浙江某地人才(简直是抢人)新政!
- python爬虫中for循环无法每一段输出_1024程序员节送你一套爬虫玩玩
- 树莓派AI视觉云台——1.树莓派Pi3简介
- Codeforces A - Bear and Prime 100(交互题)
- npm 安装报错 rollbackFailedOptional verb npm-session无法解决?
- envi中的sg滤波_ENVI滤波
- Python(14)-模块
- Docker必备知识整理
- SPOOLing假脱机技术详细介绍
- 测试:fiddler使用
- 1秒后跳转页面(延时setTimeout)
- 程序编译与代码优化 -- 早期(编译期)优化
- Flink状态专题:keyed state和Operator state
- 斑能不能彻底去掉_鸡脖、猪脖子上有淋巴结,会有大量毒素、病菌?还能不能放心吃?...
- python绘制动态心电图_长时动态心电图ECG数据可视化
- 机器学习周志华第三章笔记
- (BLE)蓝牙抓包(1) -nRF-sniffer和wireshark
- 用CSS实现立方体360度旋转
- IIS Express配置使通过IP访问
- macbook键盘背光打不开怎么办?如何解决苹果笔记本键盘背光不亮的问题?
热门文章
- 使用DevCpp/DevC++调试的设置和步骤
- python流量分析_python 监控流量
- 超详细!JDK 8 下载、安装和环境配置(macOS 和 Windows 版本)
- t470键盘拆解_Thinkpad 二手T470笔记本拆解|支持双硬盘|拆机教程
- fanuc系统屏蔽服务器,FANUC伺服轴的屏蔽方法
- 研发/项目计划管理表格
- 超宽屏幕比例_显示器屏幕比例与分辨率对照表
- 一个简单的微信小程序支付demo
- 你知道手动探针台系统的用途及组成部分吗?
- 我的学习日志11.6