【问题标题】:JNI Wrapping another LibraryJNI 包装另一个库
【发布时间】:2014-07-28 16:58:21
【问题描述】:

我是新手,但基本上我的情况是这样的:几个月前,我用 Java 开发了一个使用 Kinect 运行的应用程序。现在我们需要将应用程序迁移到 Kinect 2。为此,我必须在现有的 Kinect 2 SDK 上编写一个包装器。

我 2 天前开始阅读 JNI 教程,到目前为止,我可以包装自己的 C++ 代码,但是当涉及到其他库时,我不能,这就是我正在尝试做的事情:

现在,在使用 Kinect 2 SDK 之前,我正在尝试对我已经使用过的东西(OpenCV)做一个小包装。我编写了一个使用 C++ 编写的 OpenCV 代码初始化图像的小类(仅用于学习目的)。当我尝试构建 DLL 时,一切正常,但是当我尝试使用我的 Java 代码运行时,我得到“%1 Not a Valid Win32 Application”。如果我注释使用 OpenCV 代码的每一行,那么我不会收到任何错误,并且可以运行我的包装器中没有 OpenCV 的其他函数。

我想问题是一些错误的配置。

我使用的是:

  • Netbeans (Java)
  • Visual Studio 2013 (C++)

【问题讨论】:

  • 出现此类错误的另一个原因是您在作为 32 位应用程序运行时加载了 64 位模块。
  • 我想了解更多关于您正在编译什么、如何编译以及 java 如何与之交互的信息。您如何称呼您的 Java 应用程序? Java 是如何加载和使用原生函数的?
  • 听起来是 JavaCPP 预设的完美候选者:github.com/bytedeco/javacpp-presets/wiki/Create-New-Presets

标签: java c++ java-native-interface wrapper


【解决方案1】:

您的 java 机器在 32 位或 64 位上运行。

您的 dll 需要为与 java 机器相同的机器编译:

  • 如果您在 32 位 java 机器上运行,则需要 32 位 dll(即使系统是 x64)
  • 如果您在 64 位 java 机器上运行,则需要 64 位 dll(系统只能是 x64)

在 Visual Studio 中检查您正在为其编译 dll 的平台。它应该与您在 netbeans 中使用的 jre 匹配。

【讨论】:

  • 我已经检查过了,一切都很好。正如我所写,我可以使用包装方法,只要它不包含 OpenCV 库,否则它会抛出错误。如果我尝试为 32 位编译 dll,则所有包装函数都不起作用,它会给我另一个错误:“无法在 AMD 64 位平台上加载 IA 32 位 .dll”
  • 你的包装器是指 C++ 包装器,对吗?注释每一行是指注释 C++ 中的每一行?如果它是 C++ ,那么您的包装器可能会使用对 OpenCV.dll 的依赖项。尝试在 Java 中加载包装库之前加载 OpenCV.dll。 dll依赖树可能有问题。
  • 是的,这正是我的意思,我将尝试一下。我应该在java中加载dll吗?
  • 问题可能是当您加载 dll 时,您的包装器的 dll 依赖项之一不满足。有像 DllDependencyWalker 这样的工具可以让您查看动态链接的 Dll 是什么 Dll。如果当您尝试在 Java 机器中加载 dll 时找不到所需的 dll(或正确版本的 dll),它将失败。一种快速的方法是将所有 OpenCV dll 及其依赖项复制到 system32 并查看会发生什么。
  • 成功了,谢谢 :D 我没有将 DLL 放在 System32 中,而是将它放在 java 项目的根目录中并且它可以工作(没有尝试将它们放在 System32 中)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多