Как использовать нативную библиотеку JNI из приложения Grails - PullRequest
2 голосов
/ 24 февраля 2012

Я занимаюсь разработкой веб-приложения Grails, и мне нужно использовать собственную библиотеку JNI для доступа к определенному оборудованию. Для простого Java-приложения (см. Ниже) оно работает нормально. Для этого мне просто нужно добавить JAR в путь сборки Java и указать «расположение собственной библиотеки» (я использую SpringSource Tool Suite в Windows7).

Рабочий пример:

import conceptacid.nativedriver.Driver;
public class Main {
public static void main(String[] args) {
        System.out.println("starting...");
        System.loadLibrary("AudioCardDriver");
        Driver driver = Driver.instance();
        String driverDescription = driver.getDriverDescription();
        System.out.println( "Native application driver: " + driverDescription);
    }
}

Однако, когда я пытаюсь добавить его в приложение Grails, происходит сбой: Bootstrap.groovy:

import conceptacid.nativedriver.Driver;

class BootStrap {

    def init = { servletContext ->
    System.loadLibrary("AudioCardDriver");
    Driver driver = Driver.instance();
    String driverDescription = driver.getDriverDescription();
    System.out.println( "Native application driver: " + driverDescription);
    }
    def destroy = {
    }
}

первая строка System.loadLibrary("AudioCardDriver"); выполняется без каких-либо исключений, но следующая строка, где я пытаюсь использовать свой собственный код Driver driver = Driver.instance();, не выполняется:

Running script C:\grails\scripts\RunApp.groovy
Environment set to development
  [groovyc] Compiling 1 source file to D:\Projects3\mbr\target\classes
   [delete] Deleting directory C:\Users\VShmyrev\.grails\1.3.7\projects\mbr\tomcat
Running Grails application..
2012-02-24 15:19:49,690 [main] ERROR context.GrailsContextLoader  - Error executing  bootstraps: java.lang.UnsatisfiedLinkError: conceptacid.nativedriver.AudioCardDriverJNI.swig_module_init()V
org.codehaus.groovy.runtime.InvokerInvocationException:   java.lang.UnsatisfiedLinkError:   conceptacid.nativedriver.AudioCardDriverJNI.swig_module_init()V
at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:251)

...

Caused by: java.lang.UnsatisfiedLinkError: conceptacid.nativedriver.AudioCardDriverJNI.swig_module_init()V
at conceptacid.nativedriver.AudioCardDriverJNI.swig_module_init(Native Method)
at conceptacid.nativedriver.AudioCardDriverJNI.<clinit>(AudioCardDriverJNI.java:70)
at conceptacid.nativedriver.Driver.instance(Driver.java:35)
at conceptacid.nativedriver.Driver$instance.call(Unknown Source)
at BootStrap$_closure1.doCall(BootStrap.groovy:7)
... 26 more
Application context shutting down...

Я уверен, что поместил DLL в каталог, который находится в моей системной переменной PATH, но это не помогает.

Как правильно использовать встроенную библиотеку в приложении Grails как в среде разработки, так и на производстве?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Ваша DLL должна находиться по пути, указанному в системном свойстве Java java.library.path. В Windows переменная среды PATH и Linux переменная среды LD_LIBRARY_PATH добавляются к этому системному свойству. Вы можете попробовать войти в системное свойство java.library.path, чтобы увидеть, ищет ли Java правильное место для вашей DLL.

1 голос
/ 22 мая 2013

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

...