2023-01-20 310
我有一个需要使用本机库的应用程序:libfoo.so
我的代码如下:
conscentor.java:
public class Accessor {
static {
String path = "/usr/lib/libfoo.so";
System.load(path);
}
...
}
当我在独立的tomcat服务器中部署战争文件时,这很好.
运行时我尝试运行嵌入式的tomcat服务器的问题:
grails run-app
我得到一个不满意的Linkerror:
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.groovy文件更改为叉模式,它也有效.
buildconfig.groovy:
grails.project.fork = [
run: [maxMemory:1024, minMemory:64, debug:false, maxPerm:256]
]
我不想以叉子模式运行它.
我注意到正在使用两个不同的类加载程序.
在非叉子模式下,正在使用此类加载程序:java.net.URLClassLoader
在分叉模式下,正在使用此类加载程序:groovy.lang.GroovyClassLoader
本地库在分叉模式下正常工作,因此我需要提出一个黑客攻击,以将库加载在grovyclassloader下以非架模式.
这是JDK源中定义System.Load的方式:
system.java:
public final class System {
...
public static void load(String filename) {
Runtime.getRuntime().load0(getCallerClass(), filename);
}
...
}
使用classloader和文件名调用load0.显而易见的解决方案是使用您自己的ClassLoader调用load0,但是由于包裹保护了它,因此无法调用它.
当您以Groovy编写代码时,您可以访问受包装保护和私有方法/变量.
我可以指定自己的classloader并加载库,因此:
class Accessor {
static {
String path = "/usr/lib/libfoo.so"
//System.load(path);
Runtime.getRuntime().load0(groovy.lang.GroovyClassLoader.class, path)
}
...
}
我只是尝试过它,并且正在以非刀具模式工作.
我的猜测是,在同一JVM中,在不同的类负载器中多次加载了访问者类(假设Grails在与嵌入式tomcat的JVM中运行).通过在静态块中添加调试语句来测试此消息.
以上所述是小编给大家介绍的当从Grails应用程序中使用JNI本地库时,出现不满意的链接错误,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26067.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态