【发布时间】:2015-10-23 06:58:00
【问题描述】:
当我从 C 调用函数时使用 JNA 时出现类似标题的错误。
我正在使用 Java 进行开发,我想在 C 中使用 .dll 中的函数。我已成功调用另一个函数。
这是我的函数的 C 头文件..
SERVICE_API BOOL apiDoTransactionEx
( ITransactionIn* transactionReq,
ITransactionOut* transactionResp,
unsigned short nApplicationNumber,
unsigned char *inBuffer,
unsigned long inBufferSize,
unsigned char *outBuffer,
unsigned long *outBufferSize );
class ITransactionOut
{
public:
virtual char* getAmount() = 0;
virtual char* getC3Error() = 0;
virtual char* getCurrencyCode() = 0;
virtual char* getTerminalNumber() = 0;
virtual char* getUserData1() = 0;
virtual char* getPrivateData() = 0;
};
class ITransactionIn
{
public:
virtual bool setAmount(char* amount) = 0;
virtual char* getAmount() = 0;
virtual bool setTermNum(char* termNum) = 0;
virtual char* getTermNum() = 0;
virtual bool setCurrencyCode(char* currencyCode) = 0;
virtual char* getCurrencyCode() = 0;
virtual bool setOperation(char* operation) = 0;
virtual char* getOperation() = 0;
virtual bool setAuthorizationType(char *type) = 0;
virtual char* getAuthorizationType() = 0;
virtual bool setCtrlCheque(char* ctrlCheque) = 0;
virtual char* getCtrlCheque() = 0;
virtual bool setUserData1(char* data) = 0;
virtual char* getUserData1() = 0;
};
目前我在 Java 中的映射是..
boolean apiDoTransactionEx(ITransactionIn transIn,
ITransactionOut transOut,
int appNumber,
String inBuffer, //extdatain
long inBufferSize, //extdatainsize
String outBuffer, //extdataout
long[] outBufferSize //extdataoutsize
);
public interface ITransactionIn
{
boolean setAmount(String amount);
String getAmount();
boolean setTermNum(String termNum);
String getTermNum();
boolean setCurrencyCode(String currencyCode);
String getCurrencyCode();
boolean setOperation(String operation);
String getOperation();
boolean setAuthorizationType(String type);
String getAuthorizationType();
boolean setCtrlCheque(String ctrlCheque);
String getCtrlCheque();
boolean setUserData1(String data);
String getUserData1();
}
public interface ITransactionOut
{
String getAmount();
String getC3Error();
String getCurrencyCode();
String getTerminalNumber();
String getUserData1();
String getPrivateData();
}
但是每当我调用该函数时,它总是会返回这样的错误...
Exception in thread "JavaFX Application Thread"
java.lang.IllegalArgumentException: Unsupported argument type com.cashlez.km.client.controllers.IPEKInjectorController$2 at parameter 0 of function apiDoTransactionEx
at com.sun.jna.Function.convertArgument(Function.java:626)
at com.sun.jna.Function.invoke(Function.java:305)
at com.sun.jna.Library$Handler.invoke(Library.java:236)
at com.sun.proxy.$Proxy5.apiDoTransactionEx(Unknown Source)
谁有一些替代映射? 最好的问候。
【问题讨论】:
-
我还没有找到正确的方法来完成这个..有人可以帮忙吗?
-
您不能仅仅创建一个以 C++ 类命名的 Java 接口,然后就期待奇迹发生。您的 Java 代码如何获得这些接口的实例化?您可以将 C++ 对象作为
Pointer在 native 和 Java 之间来回传递,但 JNA 不知道如何将任意 Java 接口转换为 native 类型,除非您告诉它如何。