【问题标题】:How to use a Windows DLL with Java in Mac OS X?如何在 Mac OS X 中使用带有 Java 的 Windows DLL?
【发布时间】:2011-12-15 15:09:02
【问题描述】:

我看到一些 Java 项目使用 taucs.dllTAUCS — 一个稀疏线性求解器的 C 库,通过 Windows 中的 JNI。我想我可以通过将 TAUCS 编译成 libTaucs.jnilib 之类的东西在 Mac OS X 中实现同样的效果。我可以访问库的代码,但不知道如何将其编译成 DLL,更不用说 JNI 库了。到目前为止,我只能编译成静态库。

有没有办法将 DLL 转换为 Mac 的 JNI 库?如果我必须编译代码,该怎么做?将静态库包装在动态库中是否可以与 JNI 一起使用,尤其是对于 TAUCS,如果有人有经验的话?

【问题讨论】:

    标签: java c macos dll java-native-interface


    【解决方案1】:

    很多操作系统都有共享库的概念,当然这些库的格式等在不同的操作系统上是不同的。

    DLL(动态链接库)是 Windows 版本的共享库。您不能只在 Mac OS 上使用 Windows 机器上的 DLL,就像不能在 Mac OS(或任何其他操作系统)上运行 Windows 应用程序一样。

    您需要找到您尝试使用的本机库的特定于 Mac OS 的版本,而不是尝试在 Mac OS 上使用 Windows DLL。或者,如果您有源代码,请将其编译为 Mac OS 原生共享库。 Mac OS X 上的共享库具有扩展名 .so(而不是 .dll),代表“共享对象”。
    仅使用 Java 加载它们是不可能的。

    【讨论】:

    • 感谢您的回答。其实我是知道的,但是这样形成问题是因为我暗中希望有一个神奇的步骤来做到这一点。顺便说一句,Wine 将反对让我的繁重功能更快的整个想法。
    • 为了准确性。说 Java 不可能是不准确的。当然这是可能的,但这并不容易,并且有(AFAIK)现成的设施。原则上,我们需要做的就是编写可以读取 .dll 文件并解析入口点的代码,然后使用例如 JNA 通过这些入口点调用它们。如果 .dll 调用 WinAPI(很多/大多数都会这样做),那么一个额外的复杂情况是,这就是 Wine 解决方案的用武之地。这是可能的,但并不容易且非常费力。
    • 为了准确,使用 WINE 也不一定慢。设置和启动 WINE 需要时间,但取决于 .dll 函数的调用方式,执行它们可能会很快。
    【解决方案2】:

    最终微软发布了完全独立于平台的.NET Core。当您使用 .NET Core 框架构建 DLL 时,您可以使用以下命令运行该文件。

    dotnet yourapp.dll
    

    此外,现在可以在 Mac 或 Linux 机器上使用轻量级 IDE 开发 .NET 应用程序 Visual Studio CodeVisual Studio for Mac IDE 已发布,其中集成了 Mono on MacOS X

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2014-04-21
      • 2012-12-21
      相关资源
      最近更新 更多