当前位置: 首页 > 知识库问答 >
问题:

为什么这个基于JNI的JBoss模块抛出错误“找不到依赖库”?

欧阳狐若
2023-03-14

我有一个Java web应用程序myproject。war部署到JBoss。应用程序的一部分使用JNI连接到C DLL,后者从一组第三方库调用函数。我们正在将此应用程序从x32服务器迁移到x64服务器。

先前环境构建

  • 32位Windows Server 2003
  • JBoss 6. X
  • Java1.6. X

新环境构建

  • 64位Windows Server 2008 R2,SP1(6.1.7601)
  • JBoss AS 7.2.0最终版“Janus”
  • Java Runtime 1.7.0\u 45-b18
  • 已安装Visual Studio 2010可再发行x64

在旧系统上,自定义DLL和第三方库被随意转储到C:\Windows\System32中,应用程序能够通过JNI成功连接到它们。第三方库包括几个DLL、一些ICC配置文件和一个资源文件夹,其中包含文件的子文件夹,包括True type字体、配置和其他文件。

对于迁移,创建了一个JBoss模块来包含JNI代码。Java/JNI代码被移动到MyModule。jar和MyDriver。dll已重新编译到x64。获得了第三方库的x64版本。

我有

  • 重新编译MyDriver。使用Visual Studio 2010(10.0.40219.1 SP1Rel)的64位dll

DLL编译时使用

  • MFC的使用:使用标准Windows库

无论我做什么,在启动应用程序时,JBoss都会抛出以下Java错误:

Java语言lang.UnsatifiedLink错误:D:\Jboss\Jboss-7.2.0。Final\modules\com\mymodule\main\lib\win-x86\u 64\MyDriver。dll:找不到依赖库

这告诉我的是

  1. JBoss可以从模块中检测到正确的DLL,因此我已经正确配置了模块
  2. 某些依赖库不在JBoss的路径中

我尝试了以下解决方案,但没有一个有效,错误仍然存在:

  1. 我已经安装了Visual Studio 2010可再发行x64,它可能已经打包好了
  2. 我已经向Windows环境变量PATH显式添加了{JBOSS\u HOME}\modules\com\mymodule\main\lib\win-x86\u 64,并用echo%PATH%确认了这一点,其中包括:D:\Java\jdk1.7.0\u 45\bin;D: \Jboss\Jboss-7.2.0。Final\modules\com\mymodule\main\lib\win-x86\u 64
  3. 我已经运行了x64 Dependency Walker,它告诉我MSVCP100D。DLL,MSVCR100D。DLL和IESHIMS。未找到DLL。我找到了两个MSCV。c:\Windows\System32和c:\Windows\SysWOW64文件夹中的DLL文件,但每个文件夹中的文件大小不同。Dependency Walker检测到要驻留在system32中的其他文件的路径,因此我不理解它为什么找不到MSCV*。DLL文件。为了测试,我把它们放在同一个文件夹中。。。\lib\win-x86\u 64作为MyDriver。dll,但这并没有改变什么

我可以如何解决此问题?

模块。xml

<module xmlns="urn:jboss:module:1.1" name="com.mymodule">

    <main-class name="com.mymodule.DriverClassName"/>

    <resources>
        <resource-root path="MyModule.jar"/>
    </resources>

    <dependencies>
        <module name="sun.jdk"/>
    </dependencies>    
</module>

MyDriverLoader。java

public class MyDriverLoader {

/**
 * Load C++ Library
 */
static {  

    System.loadLibrary("MyDriver");
}

/**
 * Native Method to return the version of the C++ DLL.
 */
public native static String getVersion();

/**
 * Main method calls getVersion.
 * 
 * @param args
 */
public static void main(String args[]) {

    System.out.println("MyDriverLoader calling MyDriver.dll version " + getVersion());
}
}

jboss部署结构

<jboss-deployment-structure>
    <deployment>    
    <dependencies>
            <module name="com.mymodule" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

模块mymodule的文件夹结构:

{JBOSS\u HOME}\modules\com\mymodule\main

  • MyModule。罐子

共有1个答案

昝成弘
2023-03-14

我想通了,事情是这样的。

>

  • 我首先从JBoss中取出DLL,并试图通过x64开发/质量保证服务器上的JNI调用本机方法直接访问它。此操作失败,并出现相同错误。这意味着它不是JBoss。

    我从DLL中删除了对第三方库的引用并尝试再次访问它。这也因相同的错误而失败。这意味着这不是第三方库或它们的路径问题。

    我创建了一个普通的DLL,它只是吐出一个字符串,并试图以与前两次相同的方式访问它。它也失败了。这意味着它不是我的代码。

    我在VS 2010中编译DLL作为调试。我将DLL重新编译为Release。这就解决了问题。

    我找到了一个非常有用的答案,我再也找不到了,否则我会把它联系起来。

    正如我现在所理解的,如果您在Debug中编译一个DLL,它不应该是可再分发的。我在Debug中编译并在我的x32开发服务器上使用的x32 DLL并非如此,但兼容的x64 DLL肯定是如此。我编译为发布版,并且能够在整个应用程序中使用DLL。

    我已经改变了构建未来开发部署的常规。

  •  类似资料:
    • 我正在尝试设置Spring AoP框架,但我不想依赖AspectJ,因此我将在一个bean xml配置文件中声明我的方面、建议等,类似于以下内容: 每当我指定如上所述的切入点时,我都会收到以下错误: 当我把aspectjweaver.jar.包括在内时,我可以做到这一点,但这不应该是这样。有什么想法吗? 提前谢谢

    • 我刚刚做了一个项目。我以前用过ant,它有以下结构: MYPROJECT/pom.xml(耳)MYPROJECT-EJBpom.xmlMYPROJECT-WARpom.xml 如果我构建ejb和jar项目,它就会工作。如果我把所有东西都清理干净,从耳朵开始,它就不会。下面是我从jenkins的“maven clean install”中得到的信息: [警告]be的POM。瓦卢亚。myproject

    • 我在Maven中有一个相当简单的带有子模块的项目结构: 在中,我定义了所有子模块的属性,如库版本或插件配置: 直接在节点中设置库版本。 在中设置节点。 尝试不同的库版本。 使用以及库是否存在。 在中运行。 在中运行。 在中运行 在中运行。 在中运行。

    • 我试图编写一个简单的Java程序,通过JNI调用C函数来打印“Hello World”。一切编译都没有错误,但当我运行程序时,我得到一个“UnsatisfiedLinkError:找不到依赖库”。 根据Dependency Walker和dumpbin的说法,唯一的依赖项是“kernel32.dll”,在C:\Windows\System32及其依赖项中,也在System32中。 使命感 返回时没

    • 我刚刚安装了IntelliJ Community2020.2.1(Maven3.6.3)。我有一个名为“Genetest1”的相对简单的项目,它有一个聚合器/父pom和两个子模块,core和Playground: 相关的pom部分如下: 这个想法是在playground模块中进行TestNG测试,并在执行过程中调用核心模块中的实用程序方法。在上面的结构中,playground JacksonBas

    • 我尝试了Hello world JNI,来自: http://home.pacifier.com/~mmead/jni/cs510ajp/ 我学习了Java类: 然后打电话进来: cpp文件如下所示: 我已切换到JDK x86并使用x86编译: 我使用了QT文件夹中的MINGW32的gcc(希望没问题) 注意:我必须添加共享,否则会出现错误: 请注意,我已经确保运行的是x32 jdk的java,并