【发布时间】:2012-09-27 07:00:10
【问题描述】:
我正在开发一个必须使用第三方 dll(比如 abc.dll)的 Java 项目。所以我使用 JNI 创建了一个本地头文件。
然后我在 vs2005(典型的 win32 应用程序)上创建了一个 dll 项目,并添加了由 JNI 创建的头文件。我为项目选择了 clr old syntax support,并添加了 abc.dll 作为对我项目的引用。
到目前为止,一切正常。这是问题所在。我使用 abc.dll 中的一些方法实现了头文件中定义的方法。 abc.dll 有一个名为“abc”的类,这就是我所做的:
abc *abcObj = new abc(); abcObj->callSomeMethod();
我从解决方案中构建,一切正常。但是当我运行我的 Java 程序时,我从 JVM 收到一个错误,告诉我本机代码崩溃了?!?!我调试了它,问题出在 new() 中。它根本无法实例化 abcObj。
然后我尝试了一个使用该 abc.dll 的 c++ 应用程序。它奏效了。
我认为 JNI 或托管/非托管的东西一定有问题。我在 c/c++ 方面没有真正的经验,所以我不太了解(至少我现在没有时间了解)。我唯一要做的就是使用第三方 dll 创建一个包装 dll 并在我的 java 应用程序中使用该包装 dll。
任何帮助将不胜感激。
提前谢谢...
-海达
编辑:我拥有第三方 dll 所需的所有 dll。
【问题讨论】:
-
所有这些工作所需的 DLL 是否有可能不在加载路径中? IE。如果无法从工作目录、PATH 环境变量或 windows 和 system32 文件夹中加载 JNI 所需的 DLL,则会出现此错误。
-
我担心您将需要花一些时间来基本了解 JNI :-) 我将从一个非常简单的方法开始:将您的第三方 dll 放在一边,然后实现一个方法,例如返回两个整数之和。一旦成功,您可以使用所有必要的方法对其进行扩展,并添加您的第三方 dll。
-
@Andreas 绝对是这样。从小处着手,等你长大了就征服世界。
-
@Andreas 在我开始之前我已经这样做了。顺便说一句,问题没有加载。 dll 被加载,直到我创建一个 abc 对象,一切都很好。
-
那么我们需要更多的上下文。简单地在 C++ 堆上创建一个对象通常不会使 JVM 崩溃。打印的确切错误消息是什么(“本机代码已损坏”)?您使用的是哪个 JDK 版本?你如何初始化JNI?同样,我仍然会采用循序渐进的方法:从正在运行的示例 JNI 应用程序开始,然后逐步添加附加代码(最好使用版本控制系统并在每一步后检查代码)。
标签: java c++ dll visual-studio-2005 java-native-interface