Моя команда создает веб-сервис в Eclipse (Indigo с идентификатором сборки: 20110615-0604), предназначенный для сервера приложений JBOSS 5.1 (необоротный и версия по определению заказчика).Собственные алгоритмы моей компании находятся в общей библиотеке, скомпилированной на 64-битной машине Linux, и мне нужно получить к ним доступ из моего веб-сервиса.Я создал мои файлы JNI с SWIG.Результирующие файлы Java компилируются и помещаются в банку.Фляга включена в EAR и видна всеми проектами в Eclipse.Результирующий файл MODULE_wrap.cpp компилируется и включается в мой .so - назовите его libmylib.so
Мой веб-сервис при запуске вызывает статический класс для загрузки моей общей библиотеки через System.loadLibrary ("MyLib ").Там нет никаких проблем с этим.Моя библиотека загружается только один раз, исключений нет.Я проверил, что путь к моей библиотеке находится в свойстве java.library.path - как и ожидалось с тех пор, как работал loadLibrary.
Полученные SWIG-файлы работают с тестовым драйвером вне Eclipse - то есть мы можем получить доступ к собственным функциям в библиотеке.Это заставляет меня поверить, что имена функций, созданные SWIG, и собственное отображение выполняются правильно.Однако при использовании Eclipse для создания и развертывания EAR веб-службы в JBOSS мы получаем UnsatisfiedLinkError с жалобой на невозможность найти конструктор C ++ из моей библиотеки.
SWIG-линия моего make-файла
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
Если я сделаю jar -tf для jar-файла, содержащего сгенерированные SWIG JAVA-файлы, все необходимые классы в соответствующей структуре каталогов пакета будут там.Eclipse / JBOSS не жалуются ни на один из этих источников - только когда он пытается найти вызов, помеченный как «нативный» в классе JNI.
Класс Java, который загружает библиотеку.Он находится в JBoss'_Home / server / default / lib в JAR
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() {}
}
Как этот класс 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;
}