Проблемы JNI в веб-сервисе с JBOSS 5.1 и Eclipse - PullRequest
0 голосов
/ 11 ноября 2011

Моя команда создает веб-сервис в 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;
}

1 Ответ

0 голосов
/ 12 ноября 2011

решаемые

Вместо того, чтобы связать JAR-файл SWIG JNI с моим EAR, я поместил его в тот же каталог на сервере, что и мой LibLoader JAR, и увидел, что он работает.

...