Java 如何访问输出参数值

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

这是我第一次需要使用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 _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*
都是字符串,只需使用Java
String
-JNA就可以使用它。对于out参数,
char[]
将是最简单的,但
byte[]
如果您知道编码,可能会更安全。呃,除非函数将数据写入Java
byte[]
,否则您可以使用
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);