JNA使用C DLL

时间:2015-04-29 16:55:32

标签: jna

我正在使用带有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));

  }

}

我需要你的帮助。

1 个答案:

答案 0 :(得分:0)

  1. 延伸StdCallLibrary而不是StdCallCallback

  2. GetApiErrorString 可能的签名错误。如果函数希望能够写入您传递的缓冲区,则需要使用byte[]而不是String。传递String会为本机代码提供只读缓冲区。

  3. 修改

    1. 如果导出的函数的格式为StdCallFunctionMapper,则可能还需要使用funcname@NN

      options = new HashMap(); options.put(Library.OPTION_FUNCTION_MAPPER,new StdCallFunctionMapper()); lib = NativeLibrary.loadLibrary(“mylib”,options);

    2. 来自JNA FAQ

        

      我的库映射会导致UnsatisfiedLinkError

           

      使用转储实用程序检查导出函数的名称   确保它们匹配(linux上的nm,取决于Windows)。在Windows上,如果   函数的后缀为“@NN”,需要传递一个   初始化库时,StdCallFunctionMapper作为选项   接口。