我正在尝试创建 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 位版本java.lang.UnsatisfiedLinkError
在尝试加载时会导致错误:
java.lang.UnsatisfiedLinkError: com.suture.self.Util.OSAccess.osExec(Ljava/lang/String;)Ljava/lang/String;
我已经探索了此类错误的所有正常途径(确保jni.h
使用 32 位文件、检查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的意义是什么?