我正在开发Grails Web应用程序,我需要使用JNI本机库来访问某些特定的硬件。对于一个简单的Java应用程序(见下文),它工作正常。为此,我只需将JAR添加到Java构建路径并指定“本机库位置”(我在Windows7上使用SpringSource Tool Suite)。
工作示例:
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应用程序中使用本机库的正确方法是什么?
答案 0 :(得分:2)
您的DLL需要位于Java系统属性java.library.path
中指定的路径上。在Windows上,PATH
环境变量和Linux LD_LIBRARY_PATH
环境变量被添加到此系统属性中。您可以尝试记录java.library.path
系统属性,以查看Java是否正在查找DLL的正确位置。
答案 1 :(得分:1)
我猜测本机库在不同的类加载器中被多次加载,因此在运行应用程序时分配新的JVM可能有所帮助。