通过JNA查找Borland DLL中的函数时出错

时间:2016-01-04 14:09:16

标签: java dll jna

以下是我DLLService的正在运行的示例:

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public class DLLService {

public DLLService() throws Exception {
    System.out.println("version = " + version()  + "\n");
    testEvaluate();
}

public void testEvaluate() {
    System.out.println(this.loadFile("file", 1));
    int[] barre = new int[] {0, 1, 2, 3, 4};
    int[] result = new int[]{};
    evaluateParty(barre.length, barre, result, 1);
    System.out.println(result);
}

public int version() {
    return GDLL.INSTANCE.LireNoVersion();
}

public int loadFile(String tslName, int pdwNoSess) {
    return GDLL.INSTANCE.ChargerFichier();
}



public interface GDLL extends StdCallLibrary  {
    GDLL INSTANCE = (GDLL) Native.loadLibrary("tsr32_mini", GDLL.class);

    int LireNoVersion();
    int ChargerFichier();
}
}

函数version()没有问题,但loadFile(...)没有问题,我有例外:

  
    

线程中的异常" main" java.lang.UnsatisfiedLinkError:查找功能时出错' EvaluerPartie':

  
     

在com.sun.jna.Function。(Function.java:212)at   com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:541)at   com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:518)at   com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:504)at   com.sun.jna.Library $ Handler.invoke(Library.java:220)at   com.sun.proxy。$ Proxy0.EvaluerPartie(未知来源)at   DLLService.evaluateParty(DLLService.java:29)at   DLLService.testEvaluate(DLLService.java:16)at   DLLService。(DLLService.java:9)at   ProblemsIsolator.main(ProblemsIsolator.java:53)

我已经搜索但发现没有任何效果(更改类型,参数,名称......)。这是函数l的原型:DWORD ChargerFichier (LPSTR chNom, DWORD *pdwNoSess)

编辑: 即使在使用名称映射器之后也会出现相同的错误;它仅适用于LireVersion

public void testFunctionMapper() throws Exception {
        FunctionMapper mapper = StdCallLibrary.FUNCTION_MAPPER;
        NativeLibrary lib = NativeLibrary.getInstance("tsr32_mini");

        Method[] methods = {
                GDLL.class.getMethod("LireNoVersion",
                                        new Class[] { String.class, int.class }),
                GDLL.class.getMethod("ChargerFichier",
                                        new Class[] { String.class, int.class }),
        };

        for (int i=0;i < methods.length;i++) {
            String name = mapper.getFunctionName(lib, methods[i]);
            lib.getFunction(name, StdCallLibrary.STDCALL_CONVENTION).getName();
        }
}

此外,一名依赖工作者向我展示了这些方法。

2 个答案:

答案 0 :(得分:1)

这就是您使用StdCallFunctionMapper

的方法
Map options = new HashMap();
options.put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper());
MyLib lib = (MyLib)Native.loadLibrary("tsr32_mini", MyLib.class, options);

答案 1 :(得分:1)

由于它似乎适用于该链接:How do I get a java JNA call to a DLL to get data returned in parameters?,我可以看到您对ChargerFichier的定义缺少参数。

也许定义应该是这样的:

int ChargerFichier(PointerByReference chNom, IntByReference pdwNoSess);

也许此链接也可以为您提供帮助:http://www.viaboxx.de/code/java-interoperation-with-a-native-dll-using-jna/