2009-08-12 52 views
0

好的。我一直在试图编写一个我一直用Java编写的程序,能够发现Windows桌面是否被使用JNI锁定。我已经成功地获得了JNI的工作,但是我最初使用的C代码并没有返回正确的答案。我得到了一些新的代码(from here on SO),稍微改了一下,但我有链接错误。MinGW似乎没有链接到user32

链接时,我获得两个未定义的引用,一个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 [email protected] --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_g的答案),改变的是取出静态变量,因为我在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。

回答

1

我已经想通了这个问题。当我编译我的代码放在一个DLL的Java通过JNI使用,对象文件有这两个清单,当我用纳米来看看有什么目标文件中:

 U _CloseDesktop 
    U _OpenInputDesktop 

当谈到时间链接,那些没有找到,所以我得到链接器错误。当我没有所有的JNI东西代码编译成一个DLL(这显然不会使用Java工作)的符号是这样的:

 U [email protected] 
    U [email protected] 

正如你可以看到,编译做出JNI DLL时,我函数没有用@n装饰,这是什么导致我的链接错误。有谁知道我该如何解决这个问题?

那么究竟是什么问题呢?

我不包括WINDOWS.H

这使所有的差异。也许这会帮助别人。