Java 导致不满意链接错误的32位DLL

Java 导致不满意链接错误的32位DLL,java,windows,gcc,dll,java-native-interface,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 。。。在不同的机器上用64替

我正在尝试创建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
。。。在不同的机器上用64替换32(如果适用)

它们都可以正常构建,并且64位在我的应用程序中工作。但是,我的32位one在尝试加载时会导致
java.lang.UnsatifiedLinkError
错误:

java.lang.UnsatisfiedLinkError: com.suture.self.Util.OSAccess.osExec(Ljava/lang/String;)Ljava/lang/String;
我已经探索了这类错误的所有正常途径(确保使用32位
jni.h
文件,检查
java.library.path
等),但一切似乎都很好

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

32位

ordinal hint RVA      name
      1    0 00001D1F Java_com_suture_self_Util_OSAccess_osExec@12
ordinal hint RVA      name
      1    0 0000200E Java_com_suture_self_Util_OSAccess_osExec
64位

ordinal hint RVA      name
      1    0 00001D1F Java_com_suture_self_Util_OSAccess_osExec@12
ordinal hint RVA      name
      1    0 0000200E Java_com_suture_self_Util_OSAccess_osExec

在32位DLL中,@12的意义是什么?

您可以尝试添加这些选项

-Wl,--导出所有符号-Wl,--添加stdcall别名-m32-共享


编译32位代码时,将链接到链接行。--add stdcall别名将创建非修饰/非损坏的函数名。

12是gcc所做的名称损坏。您是否使用
extern“C”
导出了函数声明?不,我的C代码不包含该声明。它可以在我测试过的所有其他平台(Linux64、Sparc、Win64)上运行,但不能在Win32上运行。现在可以在32位上正常工作。尽管使用了
dumpbin
,但它向我展示了osExec的未混合和损坏的函数。无论如何,非常感谢你的帮助@SutureSelf是的,--add stdcall别名只是将一个未损坏的别名添加到损坏的函数中,因此它们都将出现在post链接中。