Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IllegalArgumentException:函数的参数0处不支持参数_Java_C++_Dll_Native_Jna - Fatal编程技术网

java.lang.IllegalArgumentException:函数的参数0处不支持参数

java.lang.IllegalArgumentException:函数的参数0处不支持参数,java,c++,dll,native,jna,Java,C++,Dll,Native,Jna,我在从C调用函数时使用JNA时出现了一个类似标题的错误 我正在用Java开发,我想在C中使用.dll中的一个函数。我已经成功地调用了另一个函数 这是函数的C头 SERVICE_API BOOL apiDoTransactionEx ( ITransactionIn* transactionReq, ITransactionOut* transactionResp, unsigned short nApplicationNumber, unsigned ch

我在从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)
有人有其他的地图吗?
致意。

好的,我会回答我自己的问题

  • 使用JNA
  • 使用通气器
  • 将C++标题复制到JNAerator,
  • 将结果复制粘贴到Java,然后让魔术开始

  • 这就是我所做的,它神奇地工作了。

    我仍然没有找到完成这项工作的正确方法。。任何人都可以帮助你?你不能仅仅创建一个以C++类命名的java接口,并期待魔法发生。Java代码是如何获得这些接口的实例化的?你可以在原生和java之间来回传递C++对象,如<代码>指针< />代码,但是JNA不知道如何将任意java接口转换成本机类型,除非你告诉它如何。