导致UnsatisfiedLinkError的32位DLL

时间:2013-11-12 14:07:48

标签: 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替换为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等等,但一切似乎都很好。

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

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 有什么意义?

1 个答案:

答案 0 :(得分:1)

您可以尝试添加这些选项

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

编译32位时,

到链接行。 --add-stdcall-alias将创建非装饰/非修改的函数名称。