有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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->;谢谢


共 (3) 个答案

  1. # 1 楼答案

    您应该检查我们的Java本机接口:

     The Java Native Interface (JNI) is a programming framework that enables Java code running 
     in a Java Virtual Machine (JVM) to call and to be called by native applications (programs 
     specific to a hardware and operating system platform) and libraries written in other 
     languages such as C, C++ and assembly.
    

    您可以找到关于JNIhere的更多信息

  2. # 2 楼答案

    我不知道这是否适合您,但我通过调用执行实际C函数的lotusscript代理从ssjs调用了C代码。这很有魅力。与您的场景不同的是,我调用的是特定于domino的C,而不是自定义dll

  3. # 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方法以找出默认位置的位置