【问题标题】:DLL to LIB - Can´t open LIB file with JNI and System.load callDLL 到 LIB - 无法使用 JNI 和 System.load 调用打开 LIB 文件
【发布时间】:2014-09-15 16:29:52
【问题描述】:

我正在使用 Visual Studio 2010 创建一个 DLL 文件,并且可以使用以下代码:

System.load("c:\\sharedFiles\\dll\\VisualDLL.dll");

现在我需要库是静态的,因为我无法在另一台机器上安装我在创建 DLL 时使用的其他库,所以我需要全部放在一个包中。将相同的代码编译到 lib 后,我的应用程序调用以下方法:

System.load("c:\\sharedFiles\\dll\\VisualDLL.lib");

但是在创建.LIB创建文件后出现如下错误用Visual Studio 2010运行应用程序出现:

c:\sharedFiles\dll\VisualDLL.dll: %1 不是有效的 Win32 应用程序

java 的版本是 1.7.09 64bits 和 Visual Studio 它正在编译为 64bit 机器目标。

发生了什么?我无法使用这种方法加载 lib 文件?

【问题讨论】:

  • (评论有点晚)好吧,System.load 所做的是动态加载。因此它只会加载动态库(Windows 中的 DLL)。

标签: java c++ visual-studio-2010 dll shared-libraries


【解决方案1】:

当您使用外部 DLL 时,您有一个 import LIB。导入库是一个存根,您的程序或 DLL 将在链接到外部 DLL 时使用它。也就是说,它在编译并将您的程序或 DLL 链接到外部库时使用。

静态 LIB 有点不同。它不是存根,它携带所有需要的代码。它就像一个 Linux 存档,您的程序或 DLL 会直接链接到它。

如果您试图让 Java 加载您的静态库 VisualDLL.lib,那将无法正常工作。


现在我需要库是静态的,因为 ...

不,它不是那样工作的。您需要围绕您的静态库构建一个包装 DLL。然后,Java 将在需要时加载您的 DLL。

【讨论】:

  • tks 为您的 cmets。它非常有用。但我不知道这是如何工作的。你有什么参考可以分享吗?
  • 好吧,您可以在 Jeffrey Richter 的 Programming Applications for Microsoft Windows 中了解 Windows 上的库链接。您可以在盛亮的The Java Native Interface: Programmer's Guide and Specification 中阅读有关 JNI 的信息。这是我用的两本书。每个都在亚马逊上以一美分(字面意思是 0.01 美元)的价格上市。他们只会花费你 3 美元或 4 美元的运费。这真是一笔大买卖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2019-04-25
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多