- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个部署到 JBoss 的 Java Web 应用程序 myproject.war
。应用程序的一部分使用 JNI 连接到 C++ DLL,后者调用一组第三方库中的函数。我们正在将此应用程序从 x32 服务器迁移到 x64 服务器。
前期环境搭建
新环境搭建
在旧系统上,自定义 DLL 和第三方库被毫不客气地转储到 C:\Windows\System32\
中,应用程序能够通过 JNI 成功连接到它们。第三方库包括几个 DLL、一些 ICC 配置文件和一个 Resource 文件夹,其中包含文件的子文件夹,包括 True-type 字体、配置和其他文件。
为了迁移,创建了一个 JBoss 模块来包含 JNI 代码。 Java/JNI 代码被移动到 MyModule.jar
,MyDriver.dll
被重新编译为 x64。已获取x64版本的第三方库。
我有
MyDriver.dll
MyDriver.dll
和 64 位版本的第三方 DLL 和资源文件夹放入模块文件夹 ..\main\lib\win-x86_64\
modules
文件夹下的路径module.xml
MyModule.jar
。
MyDriver.dll
的类 MyDriverLoader
。sun.jdk
,我不是 100% 确定 JNI 需要它。DLL是用
编译的无论我做什么,启动应用程序时,JBoss 都会抛出以下 Java 错误:
java.lang.UnsatisfiedLinkError: D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86_64\MyDriver.dll: Can't find dependent libraries
这告诉我的是
我已经尝试了以下解决方案,但都没有奏效并且错误仍然存在:
{JBOSS_HOME}\modules\com\mymodule\main\lib\win-x86_64
显式添加到 Windows 环境变量 PATH
并使用 确认echo %PATH%
其中包括:D:\Java\jdk1.7.0_45\bin;D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win -x86_64;
.MSVCP100D.DLL
、MSVCR100D.DLL
和 IESHIMS.DLL
。我在 c:\Windows\System32
和 C:\Windows\SysWOW64
文件夹中都找到了 MSCV*.DLL
文件,但它们是每个文件大小不同。 Dependency Walker 已检测到其他文件的路径驻留在 system32
中,所以我不明白为什么它找不到 MSCV*.DLL
文件。为了测试,我将它们放入与 MyDriver.dll
相同的文件夹 ...\lib\win-x86_64
中,但这没有任何改变。我该怎么做才能解决这个问题?
module.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-deployment-structure
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.mymodule" />
</dependencies>
</deployment>
</jboss-deployment-structure>
模块mymodule
的文件夹结构:
{JBOSS_HOME}\modules\com\mymodule\main
- MyModule.jar
- module.xml
- \lib\win-x86_64\
- MyDriver.dll
- ThirdPartyA.dll
- ThirdPartyB.dll
- ThirdPartyC.dll
- ThirdPartyD.dll
- \Resource\Data\Settings\
- foo.optionfile
- bar.optionfile
最佳答案
我想通了,下面是方法。
我首先从 JBoss 中取出 DLL,并尝试通过 x64 dev/qa 服务器上的 JNI 调用本地方法直接访问它。这失败并出现相同的错误。 这意味着它不是 JBoss。
我从 DLL 中删除了对第三方库的引用并尝试再次访问它。这也因同样的错误而失败。 这意味着它不是第三方库或它们的路径问题。
我创建了一个纯 DLL,它只输出一个字符串并尝试以与前两次相同的方式访问它。它也失败了。 这意味着它不是我的代码。
我一直在 VS 2010 中将 DLL 编译为 Debug。我将 DLL 重新编译为 Release。 这解决了问题。
我找到了一个有用的 SO 答案,但我找不到了,否则我会链接它。
据我现在的理解,如果您在 Debug 中编译 DLL,它不应该是可再分发的。我在调试中编译并在我的 x32 开发服务器上使用的 x32 DLL 不是这种情况,但编译的 x64 DLL 肯定是这种情况。我编译为 Release 并且能够在我的整个应用程序中使用 DLL。
我改变了构建 future 开发部署的例程。
关于java - 为什么这个基于 JNI 的 JBoss 模块抛出 Error "Can' t find dependent libraries”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068381/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!