我必须从我的Java应用程序访问Office应用程序的VBA代码,我发现THIS表示我可以使用JNI通过VisualBasic DLL访问VBA代码。如果没有必要,我不想使用COM桥,我宁愿选择DLL解决方案。 我在Visual Studio 2013中创建了一个VisualBasic类库(一个测试它是否有效的简单示例):
Public Class Test1
Public Function box()
MsgBox("boxtest!")
End Function
End Class
我构建的是一个版本,并将其放在我的Java项目中:
public class Test1 {
static{
System.loadLibrary("Test1");
}
public native void box();
}
new Test1().box();
正在调用该函数。
我收到以下例外:Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Test1.box()V
我还使用JNA来访问DLL但是经过几个小时的尝试后我无法使用它(我还读到它不能与VisualBasic DLL一起使用)。 我将我的src文件夹的本机库文件夹设置为包含DLL的文件夹。
问题:我可以在Java中使用VisualBasic DLL,如果是,使用JNA或JNI(或两者),如果是这样,我做错了什么,如何正确访问该功能? (我猜其余的返回和参数很容易然后......)
非常感谢您,祝大家圣诞快乐! :)
答案 0 :(得分:1)
不知道为什么找不到您的图书馆。根据我对JNI的记忆,您似乎没有完成调用本机例程的JNI设置,但错误消息只是说它无法找到它。您可以尝试确定库加载语句是否有效。
DLL是遵循某些规则和约定的库;我不知道" Visual Basic DLL"和任何其他类型。在某种程度上,它们需要是相同的,因为Windows程序不区分用不同语言编写的DLL,afaik,而且我已经完成了VB,足以知道我还没有看到说过的文档"这可以在VB中使用,但不能从其他语言中使用"等。
让JNI / JNA工作变得棘手而乏味。在这种情况下,语言运行时告诉您的正常内容,特别是Java运行时,并不适合您。你必须煞费苦心地浏览你所拥有的任何文档的每一行,你传递的每个参数,每次使用价值与参考等等。
我曾经使用过GitHub库here。
祝你好运。答案 1 :(得分:0)
我还没有找到如何直接从Java调用VB DLL的答案,但经过几天的研究后我发现你可以在C ++包装器的帮助下调用VB DLL。
可能可以使用JNI调用VB DLL方法,但没有关于如何执行此操作的文档。 您可以找到很多关于如何创建能够与JNI specifications from Oracle中的JNI进行通信的C ++库。
在这种特殊情况下(使用Java控制Office应用程序)我建议编写代码以使用C ++访问Office应用程序并创建DLL。
创建可能与JNI交互的C ++ DLL的基本方法是:
想想你想用C ++创建的方法的名称和.dll-name [NAME] .dll
为DLL创建一个Java类,加载库:
static{
System.loadLibrary([NAME].dll);
}
必须设置本机库路径(在Eclipse中,右键单击包含类的文件夹,然后单击“构建路径”)。
包含方法名称public native void [methodname]();
。
使用javac.exe编译.java文件(或者让Eclipse完成工作)。
使用带有-jni参数的javah.exe创建C ++头文件。
在Visual Studio中创建一个新项目(Visual C ++ MFC DLL)。
复制创建的头文件(您的Java项目),jni.h(JDK)和jni_md.h(JDK)
在Visual C ++中包含所有三个头文件 - 项目头文件[项目名称] .h
在[Project-name] .cpp中包含创建的头文件和jni.h文件。
在[项目名称] .cpp。
构建DLL,将其放在您定义的本机库路径中(请参阅2中的斜体。)。
跑步并开心!
抱歉有任何错误!
可以找到Visual Basic-DLL和JNI的示例1HERE以及其他地方,google" classle"和" JNI" (不能发布2个链接)。