gpt4 book ai didi

java - 公共(public)类加载器加载库时无法调用 JNI 方法

转载 作者:行者123 更新时间:2023-11-28 23:31:32 25 4
gpt4 key购买 nike

我正在尝试将使用 JNI 库的 Web 服务部署到 Windows 上的 Tomcat 6,并且在 Tomcat 管理器中重新启动应用程序时遇到了不良的 UnsatisfiedLinkError 问题(已加载到另一个类加载器中)。

我看到解决这个问题的最佳实践是从另一个类加载 JNI 库,在 jar 文件中指定并放入 $(TOMCAT_HOME)/lib。当我这样做时,我无法调用任何 JNI 方法,但我可以看到 JNI 库已加载。

这段代码有效:

package com.mywebservice;

import javax.jws.WebService;
import javax.annotation.PostConstruct;

@WebService
class MyWebServiceImpl implements MyWebService {

static {
System.loadLibrary ("MyJNILibrary");
}

@PostConstruct
public native void Start ();
}

Start 函数在 JNI 库中定义为 Java_com_mywebservice_MyWebServiceImpl_Start 并被调用。

下面的代码对我不起作用。首先,作为 MyLoader.jar 进入 $(TOMCAT_HOME)/lib 的加载器类。

package com.myloader;

public class MyLoader {

static {
System.loadLibrary ("MyJNILibrary");
System.out.println ("Library loaded");
}

public static void main(String[] args) {}
}

其二,修改后的web服务通过loader加载库,在webapps下仍然是war文件:

package com.mywebservice;

import javax.jws.WebService;
import javax.annotation.PostConstruct;

@WebService
class MyWebServiceImpl implements MyWebService {

static {

try {
Class.forName ("com.myloader.MyLoader");
System.out.println ("Class found");
}

catch (ClassNotFoundException e) {
System.out.println ("Class not found");
}
}

@PostConstruct
public native void Start ();
}

使用这段代码,我在尝试调用 Start 方法时看到错误:

Caused by: java.lang.UnsatisfiedLinkError: com.mywebservice.MyWebServiceImpl.Start()V

通过诊断,我可以看到找到了 MyLoader 类并且加载了(并锁定)了 JNI 库。所以我很困惑为什么这不起作用。

在 Windows 2003 Server、JDK 6u45、Eclipse Kepler 上使用 Tomcat 6.0.43。

这是它应该如何工作而我只是遗漏了什么?如果是这样,这个项目的意义何在:https://code.google.com/p/static-dll-bootstrapper/ , 它只是加载属性文件中指定的 DLL?

最佳答案

包含 native 方法的类应该加载它自己的库。其他任何事情都会引起这个问题。没有充分的理由将此功能分开。

关于java - 公共(public)类加载器加载库时无法调用 JNI 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29695189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com