【问题标题】:Problems with using a dll in a JNI-created dll在 JNI 创建的 dll 中使用 dll 的问题
【发布时间】: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


【解决方案1】:

我已经解决了这个问题。问题是我将项目创建为 win32 应用程序并选择 dll。我创建了一个 clr 应用程序,一切顺利。我按照here 的说明进行操作。

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多