从 Grails 应用程序使用 JNI 本机库时出现 UnsatisfiedLinkError

2023-12-01

我有一个需要使用本机库的应用程序:libfoo.so

我的代码如下:

访问器.java:

public class Accessor {        
    static {
        String path = "/usr/lib/libfoo.so";
        System.load(path);
    }
    ...
}

当我在独立的 tomcat 服务器中部署 war 文件时,这工作得非常好。

问题是当我尝试运行嵌入式 tomcat 服务器时运行:

grails run-app

我收到 UnsatisfiedLinkError:

Caused by UnsatisfiedLinkError: com.foo.bar.GFS_MALJNI.new_Accessor__SWIG_0(Ljava/lang/String;I)J
->>   39 | <init>    in com.foo.bar.Accessor 

有趣的是,如果我改变我的BuildConfig.groovyfile to fork 模式,它也可以工作。

BuildConfig.groovy:

grails.project.fork = [
   run: [maxMemory:1024, minMemory:64, debug:false, maxPerm:256]
]

我不想在 fork 模式下运行它。


我注意到正在使用两个不同的类加载器。

在非分叉模式下,使用此类加载器:java.net.URLClassLoader

在分叉模式下,使用了此类加载器:groovy.lang.GroovyClassLoader

本机库在分叉模式下可以正常工作,因此我需要想出一个技巧来在非分叉模式下使用 GroovyClassLoader 加载库。

这就是 JDK Source 中 System.load 的定义方式:

系统.java:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Grails 应用程序使用 JNI 本机库时出现 UnsatisfiedLinkError 的相关文章

随机推荐