我有一个Java web应用程序myproject。war部署到JBoss。应用程序的一部分使用JNI连接到C DLL,后者从一组第三方库调用函数。我们正在将此应用程序从x32服务器迁移到x64服务器。
先前环境构建
新环境构建
在旧系统上,自定义DLL和第三方库被随意转储到C:\Windows\System32中,应用程序能够通过JNI成功连接到它们。第三方库包括几个DLL、一些ICC配置文件和一个资源文件夹,其中包含文件的子文件夹,包括True type字体、配置和其他文件。
对于迁移,创建了一个JBoss模块来包含JNI代码。Java/JNI代码被移动到MyModule。jar和MyDriver。dll已重新编译到x64。获得了第三方库的x64版本。
我有
DLL编译时使用
无论我做什么,在启动应用程序时,JBoss都会抛出以下Java错误:
Java语言lang.UnsatifiedLink错误:D:\Jboss\Jboss-7.2.0。Final\modules\com\mymodule\main\lib\win-x86\u 64\MyDriver。dll:找不到依赖库
这告诉我的是
我尝试了以下解决方案,但没有一个有效,错误仍然存在:
{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
- 我已经运行了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。罐子
我想通了,事情是这样的。
>
我首先从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.包括在内时,我可以做到这一点,但这不应该是这样。有什么想法吗? 提前谢谢
我试图编写一个简单的Java程序,通过JNI调用C函数来打印“Hello World”。一切编译都没有错误,但当我运行程序时,我得到一个“UnsatisfiedLinkError:找不到依赖库”。 根据Dependency Walker和dumpbin的说法,唯一的依赖项是“kernel32.dll”,在C:\Windows\System32及其依赖项中,也在System32中。 使命感 返回时没
我在Maven中有一个相当简单的带有子模块的项目结构: 在中,我定义了所有子模块的属性,如库版本或插件配置: 直接在节点中设置库版本。 在中设置节点。 尝试不同的库版本。 使用以及库是否存在。 在中运行。 在中运行。 在中运行 在中运行。 在中运行。
我刚刚做了一个项目。我以前用过ant,它有以下结构: MYPROJECT/pom.xml(耳)MYPROJECT-EJBpom.xmlMYPROJECT-WARpom.xml 如果我构建ejb和jar项目,它就会工作。如果我把所有东西都清理干净,从耳朵开始,它就不会。下面是我从jenkins的“maven clean install”中得到的信息: [警告]be的POM。瓦卢亚。myproject
我刚刚安装了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,并