java - 32 位 DLL 导致 UnsatisfiedLinkError

标签 java windows gcc dll java-native-interface

我正在尝试创建 32 位和 64 位版本的库。

命令:

gcc -D_WIN32 -O2 -shared -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 \
-Ic:\OpenSSL-Win32\include -Lc:\OpenSSL-Win32 -leay32 -Lc:\Windows\System32 \
-lnetapi32 -std=c99 -lm -o osaccess-win32.dll osaccess.c

...在不同的机器上适当的情况下将 32 替换为 64。

它们都构建正常,并且 64 位可以在我的应用程序中运行。然而,我的 32 位会导致 java.lang.UnsatisfiedLinkError尝试加载时出错:

java.lang.UnsatisfiedLinkError: com.suture.self.Util.OSAccess.osExec(Ljava/lang/String;)Ljava/lang/String;

我已经探索了此类错误的所有正常途径(确保使用 32 位 jni.h 文件,检查 java.library.path 等),但一切似乎都很好。

我不知道这是否意味着什么,但是当我运行 dumpbin /exports <dll-name> 时针对这两个 dll,我注意到了一个小差异。

32 位

ordinal hint RVA      name
      1    0 00001D1F Java_com_suture_self_Util_OSAccess_osExec@12

64 位

ordinal hint RVA      name
      1    0 0000200E Java_com_suture_self_Util_OSAccess_osExec

32位DLL中的@12有何意义?

最佳答案

您可以尝试添加这些选项

-Wl,--export-all-symbols -Wl,--add-stdcall-alias -m32 -shared

编译 32 位时的链接行。 --add-stdcall-alias 将创建非修饰/非破坏的函数名称。

关于java - 32 位 DLL 导致 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19931352/

相关文章:

java - 模数运算返回奇怪的结果

java - 检查表数据 - Jsoup

windows - 切换 JIT 调试器?

c++ - -fsanitize=address 使用 clang++ 与 g++ 的不同输出

c++ - 需要找出函数实例化的位置(gcc 4.7)

Java,正确使用等待和通知来暂停另一个线程的线程执行

Java : Licensing a webapp. 登录前检查许可证

windows - Windows批处理文件中的过滤参数

c - c中复数的算术运算

c - 我想为我自己的 Linux 内核工作文件夹生成交叉引用