在Xpages中从服务器端javascript/java调用C代码?
我试图从IBMDomino中的Xpage调用一些第三方C代码。我有一个按钮,它有一个eventHandler,其操作创建一个Java对象,然后尝试执行一个方法,该方法只是尝试在DLL中加载和运行一个简单的测试C函数(通过JNA)。(这是在Windows 7下运行的。)以下是Java代码:
interface CLibrary extends StdCallLibrary {
int hello();
}
public class MyHelloWorld {
public void testImage() {
CLibrary INSTANCE2 = (CLibrary) Native.loadLibrary("helloWorld", CLibrary.class);
INSTANCE2.hello();
下面是C代码:
#include <stdio.h>
int
hello()
{
printf ("Hello World!\n");
}
我已将C代码编译成dll,并已导入。dll作为资源->;设计器中的文件。我还把jna放在了一起。服务器上ext目录中的jar文件。当我尝试运行所有这些时,我得到一个500错误。这里发生了很多事情,所以我不确定问题出在哪里。日志文件不会透露太多。以前有人这样做过吗?总而言之,我希望能够从XPage->;Java->;谢谢
# 1 楼答案
您应该检查我们的Java本机接口:
您可以找到关于JNIhere的更多信息
# 2 楼答案
我不知道这是否适合您,但我通过调用执行实际C函数的lotusscript代理从ssjs调用了C代码。这很有魅力。与您的场景不同的是,我调用的是特定于domino的C,而不是自定义dll
# 3 楼答案
巧合的是,我昨晚刚刚用Xpages、JNA和notes做了这件事。dll
我怀疑您的库没有在loadLibrary阶段加载
注意事项。dll可以从xpages加载而无需任何额外设置,可能是因为它位于系统路径上,但是在您的情况下,您提供的是自己的dll,我不能完全确定在loadLibrary()阶段的“资源-文件”部分是否会找到您的dll
如果你没有读过Jesper Kiaer的这篇文章 http://nevermind.dk/nevermind/blog.nsf/subject/calling-the-domino-c-api-from-an-xpage-or-a-java-agent 阅读这篇文章,然后尝试他的nsfdbspace用法示例,但要在XPage中进行。(他在Java代理中执行,但只在xpage中执行)。这样,您就知道JNA将使用XPages ok
一旦这样做成功了,那么我可以建议您在常规Java项目中尝试JNA+您的自定义dll,而不涉及任何Notes/Domino,只是为了验证它是独立工作的吗? 您可以设置属性
jna.library.path
来添加dll的自定义位置。如果您还设置了属性jna.debug_load=true
,您可以在控制台中看到JNA正在查找dll的路径,默认情况下,它是系统路径和其他一些与类路径和平台相关的约定。 如果它找不到,您将得到一个不满意的链接错误,所以请继续使用库路径,直到您可以加载dll。那么至少你会知道你的dll和JNA没有什么问题。 (如果不想进行独立的普通java应用程序测试,甚至可以在xpage中动态设置这些属性。)最后一步是处理dll的位置,以便将其加载到xpages中。尝试使用jna。图书馆path,尝试标准位置,阅读loadLibrary方法以找出默认位置的位置