如何在Java中加载和使用第三方.dll的功能

时间:2014-09-02 12:57:44

标签: java vba dll jna

我想访问Java中程序的dll(称为SAP2000v15.dll)中的一系列函数。我正在使用JNA加载文件。这是我的代码:

package testdll;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.*;

public class Testdll {

  public interface SapObject extends Library {

     SapObject SAP = (SapObject) Native.loadLibrary("SAP2000v15.dll", SapObject.class);
     public abstract int ApplicationExit(boolean FileSave);
     public abstract int ApplicationStart(eUnits units, boolean visible, String filename);
     public abstract int Hide();
     public abstract int Unhide();
     public abstract boolean Visible();
     public void _VtblGap8();

     }


public static void main(String[] args) {

    SapObject test = SapObject.SAP;

    test.ApplicationStart(eUnits.lb_in_F, true, "test.sdb");
    test.ApplicationExit(false);
    test.Unhide();
    test.Visible();
    test.Hide();
    test._VtblGap8();
    }   
 }

似乎DLL已成功加载,但每当我尝试访问其中一个函数时,我都会收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'ApplicationStart': The specified procedure could not be found.

    at com.sun.jna.Function.<init>(Function.java:179)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:347)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:327)
    at com.sun.jna.Library$Handler.invoke(Library.java:203)
    at com.sun.proxy.$Proxy0.ApplicationStart(Unknown Source)
    at testdll.Testdll.main(Testdll.java:47)

Java结果:1

该程序的文档(SAP2000 OAPI帮助文件)声明如下:

  

接下来必须创建SAP2000对象的实例(也称为实例化         您的应用程序中的对象)。在VBA中,这可以完成:

  Dim SapObjectAs SAP2000.SapObject
  Set SapObject = New SAP2000.SapObject
  

第一行创建对象变量,第二行创建SAP2000对象的实例。既然已在应用程序中创建了SAP2000对象的实例,请使用以下命令启动SAP2000:SapObject.ApplicationStart

     

此时,您可以打开现有模型,或创建新模型并执行所需的任何操作。通常,可以通过SapObject.SapModel访问OAPI命令。

它还有.dll的每个函数的定义(我在这里找到了函数的参数)。

我的第一个假设是功能&#39;名称可能有词缀或后缀,所以我用DependencyWalker打开了.dll。但是,.dll似乎太复杂了,我无法找到这些功能。

1 个答案:

答案 0 :(得分:0)

我一直在寻找如何在Java中使用SAP2000 API,并找到了这个主题。

我知道这个话题很老,但是这里的答案可能对我有帮助,我希望我的答案可以对某人有所帮助。

特别是在使用Java的Sap2000上,我没有找到任何答案,因此我决定这样做(仅适用于也希望使用Sap2000的用户):https://github.com/vitorscoelho/sw4k。对于jar文件:https://github.com/vitorscoelho/sw4k/releases

有一段时间,“ sw4k”只能与SAP2000 v14一起使用。我将很快实现其他版本。

如果'sw4k'无法帮助您,或者如果您不想使用Sap2000,则可以使用与访问COM对象相同的库。名称为JACOB(https://sourceforge.net/projects/jacob-project/)。

使用JACOB对示例进行的修改如下。

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

public class SapObject {
    private ActiveXComponent activeXComponent;

    public SapObject() {
        this.activeXComponent = new ActiveXComponent("Sap2000v15.SapObject");
    }

    public int applicationStart(int unitSapCode, boolean visible, String fileName) {
        return Dispatch.call(activeXComponent, "ApplicationStart", unitSapCode, visible, fileName).getInt();
    }

    public int applicationExit(boolean fileSave) {
        return Dispatch.call(activeXComponent, "ApplicationExit", fileSave).getInt();
    }

    public int hide() {
        return Dispatch.call(activeXComponent, "Hide").getInt();
    }

    public int unhide() {
        return Dispatch.call(activeXComponent, "Unhide").getInt();
    }

    public boolean visible() {
        return Dispatch.call(activeXComponent, "Visible").getBoolean();
    }

    public static void main(String[] args) {
        SapObject sapObject = new SapObject();
        int ret;

        ret = sapObject.applicationStart(1, true, "");
        System.out.println("ApplicationStart returns=" + ret);
        System.out.println("Visible=" + sapObject.visible());

        ret = sapObject.hide();
        System.out.println("Hide returns=" + ret);
        System.out.println("Visible=" + sapObject.visible());

        ret = sapObject.unhide();
        System.out.println("Unhide returns=" + ret);
        System.out.println("Visible=" + sapObject.visible());

        ret = sapObject.applicationExit(false);
        System.out.println("ApplicationExit returns=" + ret);
    }
}

仅当您在System32文件夹中具有JACOB dll(jacob-1.19-x64.dll或jacob-1.19-x86.dll)或执行此链接中显示的操作时,才有效:https://www.javaquery.com/2013/12/getting-started-with-jacob-example-with.html。 dll将在JACOB zip文件中。