【问题标题】:Calling C code from server-side javascript/java in Xpages?在 Xpages 中从服务器端 javascript/java 调用 C 代码?
【发布时间】:2014-08-01 01:53:26
【问题描述】:

我正在尝试从 IBM Domino 中的 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.jar 文件放在服务器的 ext 目录中。当我尝试运行所有这些时,我收到 500 错误。这里发生了很多事情,所以我不确定问题是什么。日志文件没有透露太多。有没有人这样做过?总而言之,我希望能够从 XPage->Java->C 开始。谢谢!

【问题讨论】:

  • DLL 是否可能需要在服务器文件系统上而不是在设计器中作为文件资源?
  • 是的,这是很有可能的,也是最大的问号之一。我还没有找到任何文档或指导。我无权访问服务器,所以我希望它可以作为资源处理......
  • 跟进,我的第一个问题是 jna.jar 根本没有被加载。我需要一个更新的版本,我相信。一旦我意识到并修复了这一点,我就可以通过将绝对路径作为 Native.loadLibrary() 的第一个参数传递来加载和使用我自己的 DLL。这避免了任何路径问题。 (一方面,我无法轻松修改 jna.library.path ......)

标签: java c xpages


【解决方案1】:

巧合的是,我昨晚刚刚使用 Xpages、JNA 和 nnotes.dll 进行了此操作。

我怀疑您的库没有在 loadLibrary 阶段加载。

nnotes.dll 无需任何额外设置即可从 xpages 加载,可能是因为它位于系统路径上,但是在您的情况下,您提供自己的 dll,我不完全确定您的 dll 会被找到在 loadLibrary() 阶段的 Resources - Files 部分中。

如果您还没有阅读 Jesper Kiaer 的这篇文章 http://nevermind.dk/nevermind/blog.nsf/subject/calling-the-domino-c-api-from-an-xpage-or-a-java-agent 阅读那篇文章,然后尝试他的 NSFDbSpaceUsage 示例,但在 XPage 中进行。 (他在 Java 代理中执行此操作,但只是在 xpage 中执行)。这样你就知道 JNA 可以使用 XPages 了。

一旦它工作正常,那么我是否可以建议在常规 Java 项目中尝试 JNA + 您的自定义 dll,无需任何 Notes/Domino 参与,只是为了验证它是否可以独立工作? 您可以设置属性jna.library.path 来添加dll 的自定义位置。如果您还设置了属性jna.debug_load=true,您可以在控制台中看到 JNA 正在寻找您的 dll 的路径,默认情况下它是系统路径以及与类路径和平台有关的其他一些约定。 如果找不到它,您将收到 UnsatisfiedLinkError,因此请继续使用库路径,直到您可以加载您的 dll。那么至少你会知道你的 dll 和 JNA 没有任何问题。 (如果您不想进行隔离的纯 java 应用程序测试,您甚至可以在 xpage 中动态设置这些属性。)

最后一步是使用 dll 的位置来将其加载到您的 xpages 中。尝试使用 jna.library.path,尝试标准位置,阅读 loadLibrary 方法以找出默认位置的位置。

【讨论】:

    【解决方案2】:

    我不知道这是否适合您,但我通过调用执行实际 c 函数的 lotusscript 代理从 ssjs 调用 C 代码。这就像一个魅力。与您的方案的一个很大区别是我调用的是特定于多米诺骨牌的 C,而不是自定义 dll。

    【讨论】:

    • 我对 Domino 还有些陌生,目前只使用 Xpages,所以我不是一个天生的 lotusscripter。不过,这是一个有趣的想法,我会研究一下。我想将dll放在哪里以便可以找到的问题仍然存在......谢谢。
    【解决方案3】:

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

     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.
    

    您可以了解有关 JNI here 的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2011-01-01
      相关资源
      最近更新 更多