我的团队正在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;
}
答案 0 :(得分:0)
<强>解决强>
我没有将SWIG JNI包装器JAR与我的EAR捆绑在一起,而是将它放在服务器上与我的LibLoader JAR相同的目录中,并且看得很低。