Programiranje

Združevanje Java in Win32: nov način za razvoj aplikacij Windows

Novinarski mediji so v zadnjih tednih pozornost posvetili številnim združitvam. Banke, avtomobilske korporacije in trgovske verige so objavile, da se združujejo. Si predstavljate šok, če se Sun Microsystems in Microsoft kdaj odločita za združitev? No, mislim, da ne bi smeli zadržati diha. Menim pa, da bi se Sun in Microsoft lahko kaj drugega naučila drug od drugega. Navsezadnje sta obe podjetji razvili dobre izdelke - in sicer Java in Win32. Po mojem mnenju je krivulja učenja Java precej krajša od krivulje učenja C ++. Hkrati je Win32 eden pomembnih razlogov, zakaj ima Microsoft Windows 95 / NT, ki deluje na kakih petnajstih milijonih osebnih računalnikov. Zdi se povsem naravno, da združimo Javo in Win32, da razvijalcem omogočimo prednost pri ustvarjanju boljših aplikacij za Windows v krajšem času. To je v središču tega članka.

Na začetku...

Prve aplikacije za Windows so bile napisane v jeziku C. Medtem ko je bil C v redu za majhne aplikacije, so razvijalci težko uporabljali ta jezik za organizacijo večjih aplikacij. Težava se je osredotočila na model sporočanja Windows in na dejstvo, da je C strukturiran in ne objektno usmerjen jezik. Tradicionalne aplikacije, ki uporabljajo C, bi ustvarile glavno okno in dodelile funkcijo povratnega klica (znano kot okenski postopek) do tega okna. Kadar se je temu oknu zgodilo kaj posledic, bi Windows sprožil sporočilo v okno s klicem okenskega postopka. Okenski postopek bi se odzval tako, da bi najprej identificiral sporočilo prek velikega stavka za preklop, nato pa sporočilo obdelal. Kot se pogosto zgodi, bi bilo treba stanje shraniti prek lokalnih statičnih spremenljivk ali globalnih spremenljivk. Velika aplikacija bi lahko povzročila veliko takih spremenljivk. Ta paradigma je dobro delovala pri manjših aplikacijah, vendar se je izkazala za škodljivo za večje aplikacije. Nekaj ​​je bilo treba storiti.

Jezik C se je iz strukturiranega jezika razvil v objektno usmerjen jezik - jezik, imenovan C ++. Lepo pri objektno usmerjenem jeziku je, da razvijalcem omogoča, da z uporabo predmetov resnično modelirajo entitete na bolj naraven način.

Pred nekaj leti je Microsoft izdal orodje za razvijalce, ki so želeli ustvariti Windows programe s pomočjo C ++. Ta izdelek je postal znan kot Visual C ++. Ena od funkcij, uvedenih z Visual C ++, je bil aplikacijski okvir, znan kot Microsoft Foundation Classes (MFC). Okvir MFC je zbirka razredov C ++, ki so jih napisali in preizkusili Microsoftovi razvijalci, ki izvaja veliko osnovnih funkcionalnosti sistema Windows. Številni koncepti programske opreme - od orodnih vrstic in vrstic stanja do modela pogleda dokumenta, ki temelji na arhitekturi Model-View-Controller - so bili implementirani v MFC. Ideja MFC je prihraniti čas med razvojem z uporabo kode MFC za večino aplikacije in nato razširitvijo MFC, da zagotovi edinstvene zmogljivosti te aplikacije - s pomočjo temeljnih objektno usmerjenih konceptov enkapsulacije, dedovanja in polimorfizma.

Vendar razvoj programske opreme z MFC ni lahka naloga. Da bi razvijalci današnjih aplikacij za Windows uporabljali C ++ in MFC, morajo razvijalci dobro razumeti objektno usmerjene koncepte programiranja, sintakso in posebnosti C ++, API-je za Windows in MFC.

V idealnem primeru razvijalci potrebujejo en jezik in platformo, ki jim omogoča pisanje aplikacij samo enkrat in nato njihovo uvajanje povsod. V poskusu zadovoljevanja te potrebe je Sun poleg API-jev, ki so edinstveni za Javo (na primer Java Card), uvedel različice številnih API-jev Windows, nevtralne do platforme. API-ji, ki se ukvarjajo z upravljanjem datotek, pošto, pomočjo, večpredstavnostjo in varnostjo, imajo podobne izdelke v svetu Windows. To ima za razvijalce sistema Windows eno največjo korist: razvijalci se lahko namesto, da bi se naučili veliko API-jev za Windows skupaj s C ++ in MFC, osredotočijo na učenje Java in njenih API-jev. Nato lahko z Javo razvijajo programe za Windows. Evo kako.

API za priklic

Oblikovalci Jave so pripravili mehanizem za pridobivanje kode Java za pogovor s kodo C ++. Ta mehanizem uporablja zbirko API-jev C ++, znane kot Java Native Interface (JNI). Več teh API-jev je bilo združenih in so skupaj znani kot API za klicanje.

API Invocation je sestavljen iz več funkcij JNI, ki razvijalcu omogočajo, da navidezni stroj Java (JVM) vdela v poljubno izvorno aplikacijo. Z vgrajenim JVM ima izvorna aplikacija dostop do celotnega JVM s klicanjem JNI.

JVM se ustvari s klicem na JNI_CreateJavaVM () funkcijo. Ta funkcija premakne kazalec na a JDK1_1InitArgs struktura kot argument. Ta struktura zagotavlja privzete nastavitve za JVM. Privzete vrednosti je mogoče preglasiti.

Če želite pridobiti privzete nastavitve, uporabite drugo funkcijo JNI, JNI_GetDefaultJavaVMInitArgs (), mora biti poklican. Ta funkcija vodi s kazalcem na JDK1_1InitArgs struktura kot argument. Tipično zaporedje klicev je prikazano v naslednjem seznamu:

JDK1_1InitArgs vm_args; vm_args.version = 0x00010001; JNI_GetDefaultJavaVMInitArgs (& vm_args); 

Polje različice mora biti nastavljeno pred klicem JNI_GetDefaultJavaVMInitArgs (). To polje zagotavlja, da aplikacija uporablja pravi JVM. Vrednost 0x00010001 kodira glavno številko različice zahtevanega JVM v visokih 16 bitov in manjšo številko različice v nizkih 16 bitov. Vrednost 0x00010001 pomeni, da bo v aplikacijo vdelan kateri koli JVM, katerega številka različice je 1.1.2 ali več.

Več zanimivih področij obsega JDK1_1InitArgs struktura, toda edino polje, ki ga bomo omenili v tem članku, je polje, znano kot učilnica. To polje je pomembno, ker JVM-ju pove, kje se nahajajo classes.zip in datoteke razreda aplikacije.

Ko je JDK1_1InitArgs struktura je bila inicializirana, lahko JVM ustvarite s klicem na JNI_CreateJavaVM (), kot je prikazano na naslednjem seznamu:

JavaVM * jvm; JNIEnv * env; rc = JNI_CreateJavaVM (& jvm, & env, & vm_args); 

Na tej točki deluje JNI FindClass () in CallStaticVoidMethod () bi poklicali, da bi našli ustrezen začetni razred Java in začetno glavno metodo.

Ko JVM ni več potreben, ga s klicem uniči DestroyJavaVM (), kot v naslednjem seznamu.

jvm-> DestroyJavaVM () 

Torej, kako nam API Invocation omogoča ustvarjanje aplikacij Win32 z uporabo Jave? Naslednji primer ponuja odgovor.

Primer

Odločil sem se, da ustvarim konzolo Win32, podobno PKZIP, vendar bi bila moja aplikacija nekoliko preprostejša. Omogočil bi le možnost seznama vseh datotek v zip arhivu in ekstrahiranja datotek. Moja aplikacija bi se zagnala iz ukazne vrstice z uporabo naslednje sintakse:

c: \> zip [-x datoteka] zip 

pri čemer -x je zastavica ekstrakcije, mapa je ime datoteke, ki jo je treba izvleči, in zadrgo je ime arhiva z razširitvijo zip ali brez nje.

Naslednji seznam prikazuje izvorno kodo C ++ zip.cpp. Ta koda implementira izvršljivi gonilnik ZIP. Ta gonilnik naloži JVM, razčleni argumente ukazne vrstice in poišče datoteko ZIP class, najde glavno metodo v datoteki ZIP class class, zažene glavno metodo (posredovanje seznama argumentov tej metodi) in razbremeni JVM.

// ================================================== === // zip.cpp // // Izvršljivi gonilnik ZIP // // Podpira navidezni stroj Java (JVM) 1.1.2 ali novejši // ================= ================================== #include #include #include #include #define BUFSIZE 80 // == ================================================ // Vodnik / / // Console Control Handler // // Prezri vse poskuse zaustavitve aplikacije. // // Argumenti: // // dwCtrlType - vrsta nadzora dogodka // // Vrnitev: // // TRUE (prezri dogodek) // ================== ============================== Upravitelj BOOL (DWORD dwCtrlType) {vrni TRUE; } // ========================================= // glavna // // Zip Izvršljiva vstopna točka gonilnika // // Argumenti: // // argc - število argumentov ukazne vrstice // argv - niz argumentov ukazne vrstice // // Vrnitev: // 0 (uspeh) ali 1 (neuspeh) / / ========================================= int glavni (int argc, char * argv [ ]) {int i; jint ret; JNIEnv * env; JavaVM * jvm; jclass klazz; jmethodID mid; JDK1_1InitArgs vm_args; char szBuffer [BUFSIZE], szClassPath [BUFSIZE * 2 + 15]; // Preprečite zaustavitev aplikacije zaradi pritiska na tipke Ctrl-Break ali Ctrl-C, // kliki gumba za zapiranje okna, odjava uporabnika ali izklop sistema. SetConsoleCtrlHandler ((PHANDLER_ROUTINE) Handler, TRUE); // Pridobite privzete argumente inicializacije za JVM različice 1.1.2 ali novejšo. vm_args.version = 0x00010001; JNI_GetDefaultJavaVMInitArgs (& vm_args); // Povejte JVM, kje najti datoteke razredov aplikacij in classes.zip. GetPrivateProfileString ("CONFIG", "PATH", ".", SzBuffer, 80, "zip.ini"); wsprintf (szClassPath, "% s;% s \ classes.zip;", szBuffer, szBuffer); vm_args.classpath = szClassPath; // Poskus ustvariti primerek JVM. if ((ret = JNI_CreateJavaVM (& jvm, & env, & vm_args)) NewStringUTF (""); jobjectArray str_array = env-> NewObjectArray (argc - 1, env-> FindClass ("java / lang / String"), jstr); (i = 1; i NewStringUTF (argv [i])) == 0) {fprintf (stderr, "Brez pomnilnika \ n"); vrnitev 1; } env-> SetObjectArrayElement (str_array, i - 1, jstr); } // Poskus najti razred zip. if ((clazz = env-> FindClass ("zip")) == 0) {fprintf (stderr, "Ne morem najti razreda zip. Izhod ... \ n"); vrnitev 1; } // Poskus najti glavno metodo razreda zip. if ((mid = env-> GetStaticMethodID (clazz, "main", "([Ljava / lang / String;) V")) == 0) {fprintf (stderr, "Glavne metode ni mogoče najti. Izhod. .. \ n "); vrnitev 1; } // Zaženi glavno metodo. env-> CallStaticVoidMethod (clazz, mid, str_array); // Uniči primerek JVM. jvm-> DestroyJavaVM (); vrnitev 0; } 

Upoštevajte klic Win32 GetPrivateProfileString () funkcijo. Ta funkcija išče datoteko z imenom zip.ini (ki bi se nahajal v imeniku Windows - običajno c: \ windows pod Windows 95 ali c: \ winnt pod Windows NT). Namen te datoteke je, da zadrži pot, na kateri je nameščena aplikacija ZIP. JVM bo na tem mestu iskal datoteke class.zip in datoteke razredov aplikacij (ne glede na to, od kod prikličete aplikacijo ZIP).

Drug element, ki ga je treba upoštevati, je klic na SetConsoleCtrlHandler () API Win32. Ta API preprečuje, da bi poleg drugih dogodkov tudi pritisk na tipke Ctrl-C ali Ctrl-Break ustavil aplikacijo, preden se konča. To je lahko zaželeno ali pa tudi ne, odvisno od uporabe.

Aplikacija ZIP je napisana v Javi. Uporabnikom omogoča ogled vsebine arhivskih datotek zip in tudi možnost pridobivanja posameznih datotek iz teh arhivov. Naslednji seznam vsebuje izvorno kodo za ZIP.

$config[zx-auto] not found$config[zx-overlay] not found