好的。我一直在试图让我用Java编写的程序能够通过使用JNI来找出Windows桌面是否被锁定。我已经成功地让JNI工作了,但是我最初使用的C代码没有返回正确的答案。我得到了一些新代码(from here on SO),对它做了一些修改,但我有链接错误。
链接时,我得到两个未定义的引用,一个指向OpenInputDesktop,一个指向CloseDesktop。它们都是user32.dll的一部分。
用于链接和创建DLL的命令是:
c:/MinGW/bin/gcc -shared -o JNIHelper.dll
com_little_cute_display_helper_JNIHelper.o
-Wl,--add-stdcall-alias,--kill-at,--output-def,def_file我尝试显式地添加lib目录和库,但是错误是相同的。这并不奇怪,因为MinGW将我的命令扩展到:
c:/MinGW/bin/../libexec/gcc/mingw32/3.4.5/collect2.exe --shared -Bdynamic
-e _DllMainCRTStartup@12 --enable-auto-image-base -o JNIHelper.dll
/mingw/lib/dllcrt2.o c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtbegin.o
-Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5
-Lc:/MinGW/bin/../lib/gcc -L/mingw/lib/gcc/mingw32/3.4.5
-Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib
-L/mingw/lib/gcc/mingw32/3.4.5/../../../../mingw32/lib
-L/mingw/lib -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../..
-L/mingw/lib/gcc/mingw32/3.4.5/../../..
com_little_cute_display_helper_JNIHelper.o
--add-stdcall-alias --kill-at --output-def def_file
-lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32
-ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt
c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtend.o因此,如果您阅读所有这些混乱的内容,您将看到c:/MinGW/lib (其中保存libuser32.a )和-luser32都在其中。基本上,这应该联系得很好。
这是我之前只在没有-lwtsapi32的情况下使用的命令(因为我使用的是终端服务API),它当时运行得很好,并且能够找到它需要的库。
现在,我在代码中所做的更改(dan的答案)是删除静态变量,因为我在XP上,不需要担心Win9x的兼容性。当我按原样使用他的代码时,我得到了相同的基本错误,例如,无法链接到GetProcAddress,尽管这是在kernel32中,链接器命令中已经有了。
我想我错过了一些魔法指令。标准Win32API中的函数似乎不想链接到。我已经多年没有使用C和MinGW了。我做了很多以前也没做过的事。
有人能给我指明正确的方向吗?
好吧,我一直在做这件事,但我还是被困住了。如果我把源代码变成一个简单的小C程序(没有JNI的东西),它看起来是这样的:
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#include <windows.h>
#include <windef.h>
#include <winnt.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) {
HDESK hDesk = OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
if (hDesk) {
CloseDesktop(hDesk);
printf("unlocked");
} else {
printf("locked");
}
}MinGW将很高兴地编译和链接该文件,并运行可执行文件。如果我使用了我一直使用的命令(更改以反映该文件),它将生成一个DLL,没有问题。
发布于 2009-08-12 20:10:37
我已经解决了问题。当我编译我的代码以放入一个供Java使用的DLL供JNI使用时,当我使用nm查看对象文件中的内容时,该对象文件包含以下两个清单:
U _CloseDesktop
U _OpenInputDesktop当涉及到链接的时候,这些是找不到的,所以我得到链接器错误。当我将没有所有JNI内容的代码编译到DLL (这显然不适用于Java)时,符号如下所示:
U _CloseDesktop@4
U _OpenInputDesktop@12如您所见,在编译以生成JNI DLL时,我的函数没有使用@n进行修饰,这就是导致链接错误的原因。有人知道我怎么解决这个问题吗?
那么问题出在哪里?
I不包括windows.h
一切都不同了。也许这能帮到别人。
https://stackoverflow.com/questions/1267148
复制相似问题