我想访问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似乎太复杂了,我无法找到这些功能。
答案 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文件中。