Java 如何访问输出参数值
这是我第一次需要使用JNA,我已经读了一些关于它的东西,还有一些东西对我来说不是很清楚 嗯,我需要使用第三方提供的.dll。他们向我提供了library.h文件Java 如何访问输出参数值,java,jna,Java,Jna,这是我第一次需要使用JNA,我已经读了一些关于它的东西,还有一些东西对我来说不是很清楚 嗯,我需要使用第三方提供的.dll。他们向我提供了library.h文件 /* * Biblioteca de Automação Comercial * * API para facilitar integração com CTF Client */ /*prevent multiple includes*/ #ifndef _H_AUTTAR_BIBLIOTECA_AC_CTF #define
/*
* Biblioteca de Automação Comercial
*
* API para facilitar integração com CTF Client
*/
/*prevent multiple includes*/
#ifndef _H_AUTTAR_BIBLIOTECA_AC_CTF
#define _H_AUTTAR_BIBLIOTECA_AC_CTF
/*useful definitions*/
#ifndef BOOL
#define BOOL int
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
/*OS specific*/
#ifdef _WIN32
#define CTF_API __stdcall
#else
#define CTF_API
#endif
/*make this code usable by C++*/
#ifdef __cplusplus
extern "C" {
#endif
/*API function calls*/
void CTF_API iniciaClientCTF(char* resultado, /* out */
char* terminal, /* in */
char* versao_ac, /* in */
char* nome_ac, /* in */
char* num_sites, /* in */
char* lista_ips, /* in */
char* criptografia,/* in */
char* log, /* in */
char* interativo, /* in */
char* parametros /* in */
);
void CTF_API iniciaTransacaoCTF(char* resultado, /* out */
char* operacao, /* in */
char* valor, /* in */
char* num_doc, /* in */
char* data_cli, /* in */
char* num_trans /* in */
);
void CTF_API iniciaTransacaoCTFext(char* resultado, /* out */
char* operacao, /* in */
char* valor, /* in */
char* num_doc, /* in */
char* data_cli, /* in */
char* num_trans, /* in */
char* dados); /* in */
void CTF_API continuaTransacaoCTF(char* resultado, /* out */
char* comando, /* in/out */
char* num_sc, /* in/out */
char* p_sc, /* in/out */
char* tam_sc, /* in/out */
char* aux); /* in/out */
void CTF_API finalizaTransacaoCTF(char* resultado, /* out */
char* confirmar, /* in */
char* num_trans, /* in */
char* data_cli );/* in */
/*make this code usable by C++*/
#ifdef __cplusplus
}
#endif
/*end of multiple-include prevention*/
#endif
我的映射界面是
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface ICTFClient extends Library {
ICTFClient INSTANCE = (ICTFClient) Native.loadLibrary("ctfclient",
ICTFClient.class);
public void iniciaClientCTF(byte[] resultado,
byte[] terminal,
byte[] versao_ac,
byte[] nome_ac,
byte[] num_sites,
byte[] lista_ips,
byte[] criptografia,
byte[] log,
byte[] interativo,
byte[] parametros);
public void iniciaTransacaoCTF(byte[] resultado,
byte[] operacao,
byte[] valor,
byte[] num_doc,
byte[] data_cli,
byte[] num_trans);
public void iniciaTransacaoCTFext(byte[] resultado,
byte[] operacao,
byte[] valor,
byte[] num_doc,
byte[] data_cli,
byte[] num_trans,
byte[] dados);
public void continuaTransacaoCTF(byte[] resultado,
byte[] comando,
byte[] num_sc,
byte[] p_sc,
byte[] tam_sc,
byte[] aux);
public void finalizaTransacaoCTF(byte[] resultado,
byte[] confirmar,
byte[] numTrans,
byte[] dataTransacao);
}
我的问题是:如何访问库返回的输出参数?
您认为我的接口映射正确吗?一个“out”参数通常意味着函数将写入提供给它的指针。该函数似乎没有将输出缓冲区的大小作为参数,因此您需要阅读库的文档,以了解输出需要多大的缓冲区(多少字节)
顺便说一句,如果参数中的所有
char*
都是字符串,只需使用Java字符串即可。JNA将使用它。如果API只是将输出写入传递给它的指针,只需确保创建足够大的数组,然后将其传递给函数即可。数组将包含数据。你试过了吗?我正在做类似byte[]outParameter=“00”的事情;然后我调用传递它的库…然后我想我可以使用Native.toString(outputParameterPassedBefore)进行检索。。。是吗?如果函数真的只写两个字节,那么是的。阅读库的文档,找出函数需要多少字节(即,byte[]out=newbyte[4096];
。如果参数中的所有char*
都是字符串,只需使用JavaString
-JNA就可以使用它。对于out参数,char[]
将是最简单的,但byte[]
如果您知道编码,可能会更安全。呃,除非函数将数据写入Javabyte[]
,否则您可以使用String
的构造函数将字节转换为字符串。非常感谢!我怀疑是因为支持人员(功能性而非开发)从第三方库传给我一个不起作用的代码…因为我是JNA的新手,我信任他…我很忙…他告诉我在库的一些函数中传递一个硬编码字符串作为输出参数…他给我提供了映射接口…因为我无法从库中得到我想要的结果,我开始学习一点关于JNA,但我还是觉得有些不安全…谢谢
byte[] outputBuf = new byte[4096]; // Change 4096 to the correct size
ICTFClient.INSTANCE.iniciaClientCTF(outputBuf, /* ... */);
// If the output is not ASCII, e.g. encoded in an encoding which supports Portugese characters,
// pass the correct CharSet instead
String output = new String(outputBuf, StandarsCharsets.US_ASCII);
System.out.println("Output: " + output);