JNA int*等基本类型的映射关系

前两篇文章中大概说了下关于JAVA通过JNA机制调用DLL(c/c++),是项目中需要的一部分,后来因为种种原因,放弃不用了(翻译了6K多行啊,可惜了【么了,友情提醒一下,如果真的需要把一个大的c/c++代码转换过来(头文件),建议最好写一些 正则表达式来用程序翻译,之前翻译的是一个关于球机的代码,底层DLL写好了,需要翻译头文件,大概3k行左右,因为是头文件,所以翻译比较简单,如果是复杂的数据结构比如说set啦,map啦,这些其实我也不知道该如何翻译,项目中由于都是c写的,所以翻译方便些】)


上次没忘记了添加unsigned long long以及引用映射,刚好有人问一些基本数据类型之间的映射关系,就索性把剩下的一些补上吧。

下面这些是实践调试所得,如果有问题还希望大家批评指出

int*的映射:
C++代码如下:

extern "C" __declspec( dllexport )int & Add(int &a )
{
	a=0xff;
	printf("In C++: %d\n",a);
	return a;
}

注意,引用和指针调用法是一模一样的:
JAVA中声明如下:

IntByReference  Add(IntByReference first);

调用如下:

IntByReference xy_ref = new IntByReference();
		 IntByReference xy=TestJnaLib.INSTANCE.Add(xy_ref); 
		 System.out.print(xy_ref.getValue()+" ");

输出如下:
255 In C++: 255
传参数的时候一定要用new出来,否则无法分配空间,取值的时候用另外的一个指针:

 IntByReference xy_ref = new IntByReference();
		 IntByReference xy=null;//=new IntByReference();
		 xy=TestJnaLib.INSTANCE.Add(xy_ref); 
		 System.out.println(xy.getValue());
		 System.out.println(xy_ref.getValue());



这样的输出是:
255
255
In C++: 255


关与long long64位类型的映射,其他的unsigned 都是8位,16位由32保存然后取后8位或者16位,所以想到用128位,但是传参的时候long long是一个基础变量,难不成用128位数组,好像也不行,但是这样想,反正都是64,无非是符号位的问题,先把数据取出来再说:

extern "C" __declspec( dllexport )long long  Add(long long  a )
{
	a=0x8fffffffffffffff;
	printf("In C++: %lld\n",a);
	return a;
}

	public static void main(String[] args) {
		//System.out.print("sdfsadf\n");

		long ss=10;
		long res;
		 res=TestJnaLib.INSTANCE.Add(ss); 
		 System.out.println(res);
		 System.out.println(ss);

		
	}
输出结果为:

-8070450532247928833
10
In C++: -8070450532247928833

可以看到对于无符号是可行的,反正第一位也没用,下面看看unsigned long long 怎么处理:

extern "C" __declspec( dllexport )unsigned long long  Add(unsigned long long  a )
{
	a=0x8fffffffffffffff;
	printf("In C++: %llu\n",a);
	return a;
}

对于无符号变量,用long也能取回来,但是第一位被用作了符号位,谁让java不支持unsigned呢,那么对已基本变量已经没有比64更大的了,所以我们只能用java提供的BigInteger来处理:

public static void main(String[] args) {

		long ss=10;
		long res;
		 //IntByReference xy_ref = new IntByReference();
		// IntByReference xy=null;//=new IntByReference();
		 res=TestJnaLib.INSTANCE.Add(ss); 
		 
		 BigInteger bi = new BigInteger
				 (Long.toHexString(res), 16);
		 
		 System.out.println(Long.toHexString(res));
		 System.out.println(bi);

		
	}
把返回的值用long变量来接收,然后转成16进制,在初始化BigInteger,然后,没有然后了,转了之后看看输出,就是我们要的结果了:

8fffffffffffffff
10376293541461622783
In C++: 10376293541461622783

至于如果取回来还需要进行四则运算的话,依然需要用到这个BigInteger类。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【jna-***.jar中文文档.zip】 中包含: 中文文档:【jna-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【jna-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【jna-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【jna-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【jna-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'net.java.dev.jna', name: 'jna', version: '***' Gradle (Short): implementation 'net.java.dev.jna:jna:***' Gradle (Kotlin): implementation("net.java.dev.jna:jna:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention com.sun.jna.Callback com.sun.jna.Callback.UncaughtExceptionHandler ...... ```
注:下文中的 *** 代表文件名中的版本号。 # 【jna-***.jar中文文档.zip】 中包含: 中文文档:【jna-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【jna-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【jna-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【jna-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【jna-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'net.java.dev.jna', name: 'jna', version: '***' Gradle (Short): implementation 'net.java.dev.jna:jna:***' Gradle (Kotlin): implementation("net.java.dev.jna:jna:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention com.sun.jna.Callback com.sun.jna.Callback.UncaughtExceptionHandler ...... ```
注:下文中的 *** 代表文件名中的版本号。 # 【jna-***.jar中文文档.zip】 中包含: 中文文档:【jna-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【jna-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【jna-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【jna-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【jna-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'net.java.dev.jna', name: 'jna', version: '***' Gradle (Short): implementation 'net.java.dev.jna:jna:***' Gradle (Kotlin): implementation("net.java.dev.jna:jna:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention com.sun.jna.Callback com.sun.jna.Callback.UncaughtExceptionHandler ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值