关于JNA调用dll的一些坑




char* 类型

有两种情况:

1、作为文本输入(只读)传参给dll的 函数;2、同时存在输入输出(读写)


只读时,直接将string类型传入即可;

读写时,需要指定空白的内存空间,具体在java的表现形式为:

byte[] outData = new byte[2048];//2048是内存空间大小,需要根据实际情况指定,如果返回的文本超过指定的内存大小,会崩溃?

...//此处调用dll函数

String outStr = Native.toString(outData,"gbk");


例:

对外提供的接口函数:

初始化函数:

int INIT(char * pErrMsg)

参数说明:

pErrMsg:动态库初始化错误信息。

功能描述:

检查整个运行环境:包括网络环境、运行所需文件、参数等的检查

本地临时文件的清除,比如获取照片信息交易所生成的本地jpg文件。

返回值: 成功:返回0 ;  失败:返回 -1

n 交易函数:

int BUSINESS_HANDLE(  char* inputData,

                                 char* outputData)

功能描述:HIS系统开发商需要向医保中心发送业务请求的通用函数

输入参数:inputData  

输出参数:outputData char*

返回值:成功:返回0 ;  失败:返回 <0

        输入输出参数是以^、$、|”分割的字符串

初始化函数:
public static void init(){
		//INIT函数,参数是一个char*类型的可读写参数,需要用byte[]类型
		byte[] outData = new byte[2048];
		
		int code = IYBDll.dll.INIT(outData);
		
		String result = Native.toString(outData,"gbk");
	}


发表评论

    微笑 大笑 拽 大哭 奸笑 流汗 喷血 生气 囧 不爽 晕 示爱 卖萌 吃惊 迷离 爱你 吓死了 呵呵

      已有1条评论

    1. avatar zhanghao沙发
      楼主太棒了,帮我解决了很大的问题,多谢多谢2022-02-17 23:40 回复