我在我的java代码中使用了一个C#dll库,这个库函数是使用jna调用的,这些函数的一些参数包含Structs,要在Java中创建一个等效参数,我必须创建一个{ {1}}继承static abstract class
类,它必须包含我试图创建等价的结构中存在的所有变量,以获得更多说明:
:
Structure
并且有一个类似的功能:
struct SDK_AutoConfig {
int iDay;
int iHour;
int isec;
};
所以,在Java中调用这样的函数:
run_auto_config(int x, SDK_AutoConfig auto)
告诉这里一切正常,但当另一个// Declaring the Struct
public static abstract class SDK_AutoConfig extends Structure{
public int iDay;
public int iHour;
public int isec;
}
// Instantiating it
SDK_AutoConfig auto = new SDK_AutoConfig() {
@Override
protected List getFieldOrder() {
List<Object> list = new ArrayList<>();
return list;
}
};
// And to call the function
run_auto_config(65, auto);
被声明为变量 struct
the SDK_AutoConfig
时,我无法处理我首先尝试的是定期通过它:
struct
但是当我这样做时,我得到:
public static abstract class SDK_AutoConfig extends Structure{ public int iDay; public int iHour; public int isec; public OTHER_STRUCT struct_two; }
所以,我尝试先将其实例化,然后将其传递给Exception in thread "main" java.lang.IllegalArgumentException: Invalid Structure field in class Test$1, field name 'struct_two' (class Test$SDK_AutoConfig$OTHER_STRUCT): Can't instantiate class Test$SDK_AutoConfig$OTHER_STRUCT (java.lang.InstantiationException)
的构造函数:
SDK_AutoConfig
但我得到了同样的异常。那么,如何解决这个问题?
答案 0 :(得分:0)
将您的匿名实例创建代码移至Structure
班级,然后移除abstract
修饰符。然后你可以根据需要嵌套不同的结构。
对于C#DLL导出的API,只要你的方法声明用extern "C"
修饰并且只使用C结构,它们就应该以兼容的方式导出,因此可以被JNA使用。