【问题标题】:java.lang.IllegalArgumentException: Unsupported argument at parameter 0 of functionjava.lang.IllegalArgumentException:函数的参数 0 处的参数不受支持
【发布时间】: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 类型,除非您告诉它如何。

标签: java c++ dll native jna


【解决方案1】:

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

  1. 使用 JNA,
  2. 使用 JNAerator,
  3. 将 C++ 头文件复制到 JNAerator,
  4. 将结果复制粘贴到 Java 中,让魔法开始。

这就是我所做的一切,它神奇地起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多