Фреймворк OSGI зависает при загрузке нативной библиотеки - PullRequest
1 голос
/ 02 марта 2012

Ситуация: платформа OSGI с открытым исходным кодом SMILA (http://www.eclipse.org/smila/) запущена как служба Windows с помощью Apache commons-daemon (http://commons.apache.org/daemon/).) Попытка загрузить DLL через System.loadLibrary() из пакета OSGI, в то время как Manifest.mf включает Bundle-NativeCode: path/to/dll.

Среда: Windows Server 2003, Java 1.6

Ошибка: во время вызова System.loadLibrary() завершается полный процесс Java. Когда служба останавливается, System.loadLibrary() завершает работу и продолжается выполнение кода.до тех пор, пока каркас OSGI не будет закрыт.

Ошибка не возникает в Windows Server 2008 или если каркас OSGI не запущен как служба.

Сама DLL удалена из-за отсутствия функциональностидля тестирования. Все операции импорта являются статическими, и единственная зависимая библиотека - kernel32.ddl.

Кто-нибудь может представить, почему это происходит и как это исправить?


Манифест, содержащий DLL:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: NTFS Utils Acl Win32 Library
Bundle-SymbolicName: com.eccenca.utils.ntfs.acl.win32
Bundle-Version: 2.2.0
Bundle-Vendor: brox IT-Solutions GmbH
Fragment-Host: com.eccenca.utils.ntfs
Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86))
Bundle-NativeCode: ntfsacl/Release/NtfsAcl.dll
Bundle-RequiredExecutionEnvironment: JavaSE-1.6+

Манифест, содержащий код:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: NTFS Utils Acl
Bundle-SymbolicName: com.eccenca.utils.ntfs
Bundle-Version: 2.2.0
Bundle-Vendor: brox IT-Solutions GmbH
Export-Package: com.eccenca.processing.acl,
 com.eccenca.utils.ntfs
Import-Package: org.apache.commons.io;version="1.4.0",
 org.apache.commons.lang,
 org.apache.commons.logging;version="1.1.1",
 org.eclipse.smila.blackboard;version="0.8.0",
 org.eclipse.smila.datamodel,
 org.eclipse.smila.processing;version="0.8.0",
 org.eclipse.smila.processing.pipelets;version="0.8.0",
 org.eclipse.smila.utils.config;version="0.8.0",
 org.eclipse.smila.utils.service;version="0.8.0",
 org.osgi.framework;version="1.4.0"
SMILA-Pipelets: com.eccenca.processing.acl.AccessListConverterPipelet
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

Код, выданный с помощью System.loadLibrary() Вызов:

public class ACLList {
  private static final org.apache.commons.logging.Log LOG = 
      org.apache.commons.logging.LogFactory.getLog(ACLList.class);

  static {
    try {
      LOG.debug("Start loading library");
      System.loadLibrary("NtfsAcl");
      if (LOG.isInfoEnabled()) {
        LOG.info("NTFS ACL library was succesfully loaded");
      }
    } catch (Throwable e) {
      LOG.error(e);
    }
  }

  private ACLList() {
  }

  public static native ArrayList<ACLEntry> getAccessFor(String path, 
      String serverName) throws IOException;

}

1 Ответ

0 голосов
/ 05 марта 2012

Есть две возможные проблемы с ситуацией, которую вы описали; Я не знаю точно, как Equinox обрабатывает нативный код, поэтому я просто представлю их вам обоим.

Bundle-NativeCode требует как минимум один параметр

Вы используете заголовок Bundle-NativeCode, который просто определяет библиотеку, и кажется, что вы используете Eclipse-PlatformFilter, чтобы указать, для чего предназначена эта библиотека. Раздел 3.10 spec показывает, что вам нужен хотя бы один параметр для выбора библиотеки.

Вы можете изменить заголовок Bundle-NativeCode на

Bundle-NativeCode: ntfsacl/Release/NtfsAcl.dll;osname=win32

и ваш комплект сможет найти нужную библиотеку.

Загрузка только из собственного пакета

Судя по вашему коду, вполне возможно, что вы определите библиотеку в одном комплекте и попытаетесь загрузить ее в другом; это не работает, пакет может загружать только библиотеку, в которой он находится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...