我正在使用带有C DLL文件的JNA,我有一个例外,我无法解决:
java.lang.ClassCastException:lecteur。$ proxy0无法强制转换为 com.sun.jna.Library
这是我的源代码:
package lecteur;
import java.util.HashMap;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class Lecteur {
interface NativeInterface extends StdCallLibrary.StdCallCallback {
boolean GetApiErrorString(String pcErrorString, int mxLen);
}
public static void main(String[] args) {
HashMap<String, Object> nameMapping = new HashMap<String, Object>();
nameMapping.put(Library.OPTION_FUNCTION_MAPPER, StdCallLibrary.FUNCTION_MAPPER);
nameMapping.put(Library.OPTION_CALLING_CONVENTION, StdCallLibrary.STDCALL_CONVENTION);
NativeInterface instanceInterface =
(NativeInterface) Native.loadLibrary("MVXAPI", NativeInterface.class, nameMapping);
String pcErrorString= "AOD";
int MaxLen = 275;
System.out.println(instanceInterface.GetApiErrorString(pcErrorString, MaxLen));
}
}
我需要你的帮助。
答案 0 :(得分:0)
延伸StdCallLibrary
而不是StdCallCallback
。
GetApiErrorString
可能的签名错误。如果函数希望能够写入您传递的缓冲区,则需要使用byte[]
而不是String
。传递String
会为本机代码提供只读缓冲区。
修改强>
如果导出的函数的格式为StdCallFunctionMapper
,则可能还需要使用funcname@NN
。
options = new HashMap(); options.put(Library.OPTION_FUNCTION_MAPPER,new StdCallFunctionMapper()); lib = NativeLibrary.loadLibrary(“mylib”,options);
来自JNA FAQ:
我的库映射会导致UnsatisfiedLinkError
使用转储实用程序检查导出函数的名称 确保它们匹配(linux上的nm,取决于Windows)。在Windows上,如果 函数的后缀为“@NN”,需要传递一个 初始化库时,StdCallFunctionMapper作为选项 接口。