2009-08-12 19 views
0

OK. Ich habe versucht, ein Programm, das ich in Java geschrieben habe, in der Lage herauszufinden, ob der Windows-Desktop mit JNI gesperrt ist. Es ist mir gelungen, JNI zum Laufen zu bringen, aber der C-Code, den ich zuerst benutzte, gab nicht die richtige Antwort zurück. Ich habe einen neuen Code (from here on SO), änderte es ein wenig, aber ich habe Linkfehler.MinGW scheint nicht mit Benutzer32 zu verknüpfen

Beim Verknüpfen bekomme ich zwei undefinierte Referenzen, einen zu OpenInputDesktop und einen zu CloseDesktop. Diese sind beide Teil von user32.dll.

Der Befehl verwende ich meine DLL zu verknüpfen und erstellen ist:

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 

Ich habe versucht, explizit das lib Verzeichnis hinzugefügt, sowie die Bibliothek, aber der Fehler ist gleich. Dies ist nicht verwunderlich, da MinGW erweitert mein Kommando:

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 

Also, wenn Sie all das Chaos gehen durchlesen, werden Sie, dass c sehen:/MinGW/lib (wo libuser32.a gehalten wird) und -luser32 sind beide schon drin. Grundsätzlich sollte dies gut funktionieren.

Dies ist derselbe Befehl, den ich zuvor nur ohne -lwtsapi32 verwendet habe (da ich die Terminaldienste-API verwendet habe), und es funktionierte dann gut und war in der Lage, die benötigten Bibliotheken zu finden.

Nun, was ich in dem Code änderte, den ich nahm (dan_g's Antwort) war, die statischen Variablen herauszunehmen, da ich auf XP bin und mich nicht um die Win9x-Kompatibilität kümmern muss. Wenn ich seinen Code wie er benutzt habe, habe ich den gleichen Grundfehler, kann aber nicht mit GetProcAddress verlinken, auch wenn das in kernel32 ist, welches sich bereits im Linker-Befehl befindet.

Ich denke, ich vermisse einen magischen Befehl. Funktionen im Win32API-Standard scheinen nicht miteinander verknüpft zu werden. Es ist Jahre her, dass ich C und MinGW verwendet habe. Ich mache einiges, was ich vorher auch nicht gemacht habe.

Kann mir jemand in die richtige Richtung zeigen?


OK, ich habe weiter daran gearbeitet und ich bin immer noch fest. Wenn ich die Quelle ein einfaches kleines C-Programm (kein JNI Sachen) zu machen, sieht es wie folgt aus:

#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 wird gerne kompilieren und verknüpfen, und das Programm läuft. Wenn ich die Befehle verwende, die ich verwendet habe (geändert, um diese Datei widerzuspiegeln), erzeugt es eine DLL ohne ein Problem.

Antwort

1

Ich habe das Problem herausgefunden. Wenn ich meinen Code kompilieren in einer DLL setzen für Java von JNI zu verwenden, hat die Objektdatei, diese beiden Listings, wenn ich nm verwenden, um zu sehen, was in der Objektdatei ist:

 U _CloseDesktop 
    U _OpenInputDesktop 

Wenn es an der Zeit, zu verknüpfen kommt Diese werden nicht gefunden, also erhalte ich den Linkerfehler. Wenn ich den Code, ohne all die JNI Zeug zu einer DLL kompilieren (die mit Java wird natürlich nicht) sehen die Symbole wie folgt aus:

 U [email protected] 
    U [email protected] 

Wie Sie sehen können, wenn die Erstellung einer JNI DLL zu machen, meine Funktionen werden nicht mit dem @n versehen, was meinen Verknüpfungsfehler verursacht. Weiß jemand wie ich das beheben kann?

Also, was war das Problem?

Ich war darunter nicht windows.h

, die den Unterschied gemacht. Vielleicht hilft das jemand anderem.

Verwandte Themen