我的问题是如何从结构中调用函数,该结构作为从初始调用到本机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标头