使用JBOSS 5.1和Eclipse进行Web服务中的JNI问题

时间:2011-11-10 20:11:42

标签: eclipse java-native-interface jboss5.x loadlibrary

我的团队正在Eclipse(Indigo with build id:20110615-0604)中创建一个针对JBOSS 5.1(不可协商的服务器和客户定义的版本)应用服务器的Web服务。我公司的专有算法是在Linux 64位机器上编译的共享库中,我需要从我的Web服务访问它们。我用SWIG创建了我的JNI文件。生成的java文件在jar中编译和删除。 jar包含在EAR中,可供Eclipse中的所有项目使用。生成的MODULE_wrap.cpp文件被编译并包含在我的.so中 - 称之为libmylib.so

我的Web服务启动时会调用静态类来通过System.loadLibrary(“mylib”)加载我的共享库。这没有问题。我的库只加载一次,没有例外。我已经检查过我的库的路径是在java.library.path属性中 - 正如loadLibrary工作所预期的那样。

生成的SWIG文件与Eclipse外部的测试驱动程序一起工作 - 即我们可以访问库中的本机函数。这让我相信SWIG创建的函数名称和本机映射正在正确完成。但是,当使用Eclipse创建Web服务EAR并将其部署到JBOSS时,我们收到一个UnsatisfiedLinkError,抱怨我的库中的C ++构造函数无法找到。

我的makefile的SWIG行

swig -c++ -java -package my.package -outdir java/my/package -Isrc -Iinc -o src/MODULE_wrap.cpp src/MODULE.i

MODULE.i

    /* File : MODULE.i */

%module MODULE

%include "arrays_java.i"

%apply double[] {double *};

%{

\#include "MyCPPHeader.hh"

%}

%include "MyCPPHeader.hh

我创建的共享对象:

g++ -fPIC -c -Idir1 -I. -Idir2 -Idir3 -Idir4 -Idir5 -O2 -DMACRO_DEF  src/MyCPPSource.cpp -o obj/MyCPPSource.osh

g++ -fPIC -c -Idir1 -I. -Idir2 -Idir3 -Idir4 -Idir5 -O2 -DMACRO_DEF  src/MODULE_wrap.cpp -o obj/MODULE_wrap.osh

我创建的图书馆

g++ -shared -L/usr/lib/x86_64-redhat-linux5E/lib64 obj/MyCPPSource.osh obj/MODULE_wrap.osh -o lib/libmylib.so

SWIG .JAR

如果我使用包含SWIG生成的JAVA文件的jar -tf,那么相应的包目录结构中的所有必需类都存在。 Eclipse / JBOSS不会抱怨任何这些来源 - 只有当它试图在JNI类中找到标记为“native”的调用时。

加载库的java类。它位于JAR中的JBoss'_Home / server / default / lib

public class LibLoader {
static 
{
    try
    {
        System.loadLibrary("mylib");
        System.out.println("Loaded " + System.mapLibraryName("mylib"));
    }
    catch (java.lang.UnsatisfiedLinkError e)
    {
        System.out.println("Got unsat link error " + e.getMessage());
    }
    catch (Exception e)
    {
        System.out.println("Got exception " + e.getMessage());
    }
}
public LibLoader() {}
}

如何从我的Web服务中使用LibLoader类 - 它是作为java单例实现的:

public static WebService getInstance()
{
    // loads library once outside the service
if (m_libLoader == null)
    m_libLoader = new LibLoader(); 

// Create the singleton instance
if (m_instance == null)
    m_instance = new WebService(); 

    // Create an object as defined in my library and accessed with JNI
if (m_libraryObject == null)
{
    // THIS IS WHERE I GET THE UnsatisfiedLinkError!!!!!
    m_libraryObject = new MyObjectFromSharedLibrary();
}

return m_instance;
}

1 个答案:

答案 0 :(得分:0)

<强>解决

我没有将SWIG JNI包装器JAR与我的EAR捆绑在一起,而是将它放在服务器上与我的LibLoader JAR相同的目录中,并且看得很低。