使用JNA

时间:2018-08-29 11:07:16

标签: java jna

我正在使用 BTICARD.DLL ,这是 Arinc429 卡的dll。我需要在 Java 中为诸如BTICard_CardOpen之类的功能编写包装器类。

我已经在 BTICardAPI.java 下面编写了一个接口:

package NLIPjt;

import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.Native;
// import com.sun.jna.ptr.IntByReference;
import com.sun.jna.Pointer;

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

    int BTICard_CardOpen(Pointer LPHCARD, int cardnum);
}

和我的Java实现程序 BTICardTest.java

package NLIPjt;

// import com.sun.jna.ptr.IntByReference;
import com.sun.jna.Pointer;

public class BTICardTest {
    public static void main(String args[]) {
        BTICardAPI BTI1 = BTICardAPI.INSTANCE;

        int iErr;
        int CardNo  = 0;
        Pointer CardHandle = null;

        iErr = BTI1.BTICard_CardOpen(CardHandle, CardNo);

        System.out.println("Error Value: " + iErr);
    }
}

我在netbeans IDE中遇到以下错误:


Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'BTICard_CardOpen': The specified procedure could not be found.
    at com.sun.jna.Function.<init>(Function.java:245)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:566)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:542)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:528)
    at com.sun.jna.Library$Handler.invoke(Library.java:228)
    at com.sun.proxy.$Proxy0.BTICard_CardOpen(Unknown Source)
    at NLIPjt.BTICardTest.main(BTICardTest.java:14)

寻找解决方案!

1 个答案:

答案 0 :(得分:0)

根据documentation,您需要使该库可用。有三种方法可以做到这一点。

  

使目标库可用于Java程序。有   几种方法可以做到这一点:

     

首选方法是将jna.library.path系统属性设置为   目标库的路径。该属性类似于   java.library.path,但仅适用于JNA加载的库。

     

在更改适当的库访问环境变量之前   启动虚拟机。在Windows上是PATH,在Linux上是LD_LIBRARY_PATH,   和OSX上的DYLD_LIBRARY_PATH。

     

在路径下的类路径中提供本地库   {OS}-{ARCH} / {LIBRARY},其中{OS}-{ARCH}是JNA的规范前缀   本机程式库(例如win32-x86,linux-amd64或darwin)。如果   资源在jar文件中,它将在以下情况下自动提取   加载。