JNA-从DLL调用返回的指针到Struct的本机C ++函数

时间:2018-12-04 15:44:25

标签: java c++ jna

我的问题是如何从结构中调用函数,该结构作为从初始调用到本机c ++函数的指针返回。 (我还没有开发the.dll)

猜测c ++导出功能

extern "C" __declspec(dllexport) unsigned int MTManagerVersion(int &version) { 
// some c++ code
}

extern "C" __declspec(dllexport) unsigned int MTManagerCreate(int version, ManagerAPI **managerAPI) {
// some c++ code
}

在Java世界中,我做了以下事情:

加载本机dll文件并定义dll导出功能。

public interface MTManagerAPIFactory extends Library {

MTManagerAPIFactory INSTANCE = Native.load(".\\MT5APIManager64.dll", ManagerAPIFactory.class);

    int MTManagerVersion(IntByReference version);

    int MTManagerCreate(int version, PointerByReference pointer);
}

定义指针引用结构的类。请注意,该结构仅包含函数,甚至没有单个字段/变量。

@Structure.FieldOrder({"Disconnect", "Connect"})
public class IMTManagerAPI extends Structure implements Structure.ByReference {

    public IMTManagerAPI() {
        super();
    }

    public IMTManagerAPI(Pointer address) {
        super(address);
        read();
    }

    public interface Connect extends Callback {

        public int Connect(String server, int login, String password, String password_cert, int pump_mode, int timeout);
    }

    public interface Disconnect extends Callback {

        void Disconnect();
    }

    public Disconnect Disconnect;
    public Connect Connect;
}

最后将所有组件组合在一起。

public static void main(String[] args) {
int response;

// get version
IntByReference version = new IntByReference();
response = MTManagerAPIFactory.INSTANCE.MTManagerVersion(version);
System.out.println(String.format("ManagerAPI Version %s (response %s)", version.getValue(), response));

// create manager api
PointerByReference managerAPIByReference = new PointerByReference();
response = MTManagerAPIFactory.INSTANCE.MTManagerCreate(version.getValue(), managerAPIByReference);
System.out.println(String.format("ManagerAPI Create(response %s)", response));

if (managerAPIByReference.getValue() == null) {
    System.out.println("\nWARN: Return pointer is null..\n");
}
IMTManagerAPI manager = new IMTManagerAPI(managerAPIByReference.getValue());
// invalid memory access
manager.Disconnect.Disconnect();
}

运行该应用程序后,我得到以下信息:

  

ManagerAPI 1881版(响应0)

     

ManagerAPI创建(响应0)

     

线程“ main”中的异常java.lang.Error:无效的内存访问位于   com.sun.jna.Native.invokeVoid(本机方法)位于   com.sun.jna.Function.invoke(Function.java:414)位于   com.sun.jna.Function.invoke(Function.java:360)位于   com.sun.jna.Function.invoke(Function.java:314)位于   com.sun.jna.CallbackReference $ NativeFunctionHandler.invoke(CallbackReference.java:679)   在com.sun.proxy。$ Proxy3.Disconnect(未知来源)   在App.main(App.java:28)

注意:尽管我不想使用回调,但是我找不到在结构中调用该函数的其他方法。

任何想法/协助谢谢!

P.S。我已经在堆栈溢出上读了很多其他类似的答案,没有运气。

可以找到here

更新#1 Manager API标头

0 个答案:

没有答案