Programování

Sloučení prostředí Java a Win32: Nový způsob vývoje aplikací systému Windows

Zpravodajská média v posledních týdnech zaměřila pozornost na řadu fúzí. Banky, automobilové korporace a obchodní řetězce oznámily, že se slučují. Dokážete si představit šok, kdyby se Sun Microsystems a Microsoft někdy rozhodly sloučit? Nemyslím si, že bychom měli zadržovat dech. Myslím si však, že Sun a Microsoft by se od sebe mohly něco naučit. Koneckonců, obě společnosti vyvinuly dobré produkty - jmenovitě Java a Win32. Podle mého názoru je křivka učení Java mnohem kratší než křivka učení C ++. Zároveň je Win32 jedním z důležitých důvodů, proč má Microsoft spuštěný Windows 95 / NT na několika milionech počítačů. Zdá se být přirozené sloučit prostředí Java a Win32, což vývojářům poskytne výhodu, kterou potřebují k vytváření lepších aplikací systému Windows za kratší dobu. Na to se zaměřuje tento článek.

Na začátku...

První aplikace pro Windows byly napsány v jazyce C. Zatímco C bylo v pořádku pro malé aplikace, vývojářům bylo obtížné použít tento jazyk k organizaci větších aplikací. Problém se soustředil na model zasílání zpráv systému Windows a na skutečnost, že C je spíše strukturovaný než objektově orientovaný jazyk. Tradiční aplikace využívající C by vytvořily hlavní okno a přiřadily funkci zpětného volání (známé jako postup okna) do tohoto okna. Kdykoli se v tomto okně stalo cokoli následného, ​​Windows vypálil zprávu do okna voláním procedury okna. Procedura okna by reagovala tak, že by nejprve identifikovala zprávu pomocí velkého příkazu switch-case a poté zprávu zpracovala. Jak je tomu často, stav by bylo nutné ukládat pomocí lokálních statických proměnných nebo globálních proměnných. Velká aplikace by mohla mít za následek mnoho takových proměnných. Toto paradigma fungovalo dobře pro menší aplikace, ale ukázalo se, že je škodlivé pro větší aplikace. Něco se muselo udělat.

Jazyk C se vyvinul ze strukturovaného jazyka do objektově orientovaného jazyka - jazyka s názvem C ++. Pěkné na objektově orientovaném jazyce je, že dává vývojářům možnost modelovat reálné entity přirozenějším způsobem pomocí objektů.

Před několika lety společnost Microsoft vydala nástroj pro vývojáře, kteří chtěli vytvářet aplikace pro Windows pomocí C ++. Tento produkt se stal známým jako Visual C ++. Jednou z funkcí zavedených ve Visual C ++ byl aplikační rámec známý jako Microsoft Foundation Classes (MFC). Rámec MFC je kolekce tříd C ++, napsaná a testovaná vývojáři společnosti Microsoft, která implementuje mnoho základních funkcí systému Windows. Mnoho softwarových konceptů - od panelů nástrojů a stavových řádků až po model zobrazení dokumentu založený na architektuře Model-View-Controller - bylo implementováno v MFC. Myšlenkou MFC je ušetřit čas během vývoje pomocí kódu MFC pro většinu aplikací a poté rozšířit MFC tak, aby poskytoval jedinečné možnosti této aplikace - prostřednictvím základních objektově orientovaných konceptů zapouzdření, dědičnosti a polymorfismu.

Vývoj softwaru pomocí MFC však není snadný úkol. Aby mohli vývojáři psát dnešní aplikace pro Windows pomocí C ++ a MFC, musí vývojáři dobře rozumět konceptům objektově orientovaného programování, syntaxi a zvláštnostem C ++, Windows API a MFC.

V ideálním případě vývojáři potřebují jediný jazyk a platformu, která jim umožní psát aplikace pouze jednou a poté je nasadit všude. Ve snaze uspokojit tuto potřebu společnost Sun implementovala platformově neutrální verze mnoha Windows API kromě API jedinečných pro Javu (jako je Java Card). Rozhraní API zabývající se správou souborů, poštou, nápovědou, multimédii a zabezpečením mají ve světě Windows obdoby. To má za následek jednu hlavní výhodu pro vývojáře Windows: Místo toho, aby se učili spoustu Windows API spolu s C ++ a MFC, mohou se vývojáři soustředit na učení Javy a jejích API. Poté mohou pomocí Java vyvíjet aplikace pro Windows. Zde je návod.

Invocation API

Návrháři Javy přišli s mechanismem, jak získat kód Java, aby mohl mluvit s kódem C ++. Tento mechanismus používá kolekci C ++ API známých jako Java Native Interface (JNI). Několik z těchto API bylo spojeno a jsou souhrnně označovány jako Invocation API.

Invocation API se skládá z několika funkcí JNI, které umožňují vývojáři vložit virtuální stroj Java (JVM) do libovolné nativní aplikace. S vestavěným JVM má nativní aplikace přístup k celému JVM prostřednictvím volání JNI.

JVM je vytvořen voláním do JNI_CreateJavaVM () funkce. Tato funkce vezme ukazatel na a JDK1_1InitArgs struktura jako argument. Tato struktura poskytuje výchozí nastavení pro JVM. Výchozí hodnoty lze přepsat.

Chcete-li získat výchozí nastavení, použijte jinou funkci JNI, JNI_GetDefaultJavaVMInitArgs (), musí být volán. Tato funkce vezme ukazatel na JDK1_1InitArgs struktura jako argument. V následujícím výpisu se objeví typická volací sekvence:

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

Pole verze musí být nastaveno před voláním JNI_GetDefaultJavaVMInitArgs (). Toto pole zajišťuje, že aplikace používá správný JVM. Hodnota 0x00010001 kóduje číslo hlavní verze požadovaného JVM ve vysokých 16 bitech a číslo vedlejší verze ve spodních 16 bitů. Hodnota 0x00010001 znamená, že do aplikace bude vložen jakýkoli JVM, jehož číslo verze je 1.1.2 nebo vyšší.

Několik zajímavých polí zahrnuje JDK1_1InitArgs struktura, ale jediným polem, které v tomto článku zmíníme, je pole známé jako classpath. Toto pole je důležité, protože říká JVM, kde jsou umístěny soubory Class.zip a soubory tříd aplikací.

Jednou JDK1_1InitArgs struktura byla inicializována, JVM lze vytvořit prostřednictvím volání na JNI_CreateJavaVM (), jak je uvedeno v následujícím seznamu:

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

V tomto okamžiku funguje JNI FindClass () a CallStaticVoidMethod () bude volán k nalezení vhodné výchozí třídy Java a výchozí hlavní metody.

Jakmile již JVM není zapotřebí, je zničen voláním na DestroyJavaVM (), jako v následujícím seznamu.

jvm-> DestroyJavaVM () 

Jak nám tedy rozhraní Invocation API umožňuje vytvářet aplikace Win32 pomocí prostředí Java? Následující příklad poskytuje odpověď.

Příklad

Rozhodl jsem se vytvořit konzolovou aplikaci Win32 podobnou PKZIP, ale moje aplikace by byla o něco jednodušší. Poskytovalo by to pouze možnost vypsat všechny soubory v archivu zip a extrahovat soubory. Moje aplikace by byla spuštěna z příkazového řádku pomocí následující syntaxe:

c: \> zip [soubor -x] zip 

čímž -X je extrakční vlajka, soubor je název souboru, který chcete extrahovat, a zip je název archivu s příponou zip nebo bez ní.

Následující výpis ukazuje zdrojový kód C ++ zip.cpp. Tento kód implementuje spustitelný ovladač ZIP. Tento ovladač načte JVM, analyzuje argumenty příkazového řádku, vyhledá ZIP soubor třídy, vyhledá hlavní metodu v rámci souboru ZIP soubor třídy, spustí hlavní metodu (předání seznamu argumentů této metodě) a uvolní JVM.

// ================================================= === // zip.cpp // // ZIP spustitelný ovladač // // podporuje Java Virtual Machine (JVM) 1.1.2 nebo vyšší // ================== ===================================include #include #include #include #define BUFSIZE 80 // == =============================================== // Handler / / // Console Control Handler // // Ignoruje všechny pokusy o ukončení aplikace. // // Argumenty: // // dwCtrlType - typ kontrolní události // // Návrat: // // PRAVDA (ignorovat událost) // =================== ============================== BOOL Handler (DWORD dwCtrlType) {návrat PRAVDA; } // ======================================= // hlavní // // zip Vstupní bod spustitelného ovladače // // Argumenty: // // argc - počet argumentů příkazového řádku // argv - pole argumentů příkazového řádku // // Return: // // 0 (úspěch) nebo 1 (selhání) / / ======================================= int main (int argc, char * argv [ ]) {int i; jint ret; JNIEnv * env; JavaVM * jvm; jclass clazz; jmethodID mid; JDK1_1InitArgs vm_args; char szBuffer [BUFSIZE], szClassPath [BUFSIZE * 2 + 15]; // Zabraňte vypnutí aplikace v důsledku stisknutí kláves Ctrl-Break nebo Ctrl-C, // kliknutí na tlačítka zavření okna, odhlášení uživatele nebo vypnutí systému. SetConsoleCtrlHandler ((PHANDLER_ROUTINE) Handler, TRUE); // Získejte výchozí inicializační argumenty pro JVM verze 1.1.2 nebo vyšší. vm_args.version = 0x00010001; JNI_GetDefaultJavaVMInitArgs (& vm_args); // Řekněte JVM, kde najdete soubory aplikačních tříd a classes.zip. GetPrivateProfileString ("KONFIGURACE", "CESTA", ".", SzBuffer, 80, "zip.ini"); wsprintf (szClassPath, "% s;% s \ classes.zip;", szBuffer, szBuffer); vm_args.classpath = szClassPath; // Pokus o vytvoření instance JVM. if ((ret = JNI_CreateJavaVM (& jvm, & env, & vm_args)) NewStringUTF (""); jobjectArray str_array = env-> NewObjectArray (argc - 1, env-> FindClass ("java / lang / String"), jstr); pro (i = 1; i NewStringUTF (argv [i])) == 0) {fprintf (stderr, "nedostatek paměti \ n"); návrat 1; } env-> SetObjectArrayElement (str_array, i - 1, jstr); } // Pokus o vyhledání třídy zip. if ((clazz = env-> FindClass ("zip")) == 0) {fprintf (stderr, "Nelze najít třídu zip. Ukončení ... \ n"); návrat 1; } // Pokus o nalezení hlavní metody třídy zip. if ((mid = env-> GetStaticMethodID (clazz, "main", "([Ljava / lang / String;) V")) == 0) {fprintf (stderr, "Nelze najít hlavní metodu. Ukončení. .. \ n "); návrat 1; } // Spustit hlavní metodu. env-> CallStaticVoidMethod (clazz, mid, str_array); // Zničte instanci JVM. jvm-> DestroyJavaVM (); návrat 0; } 

Všimněte si volání Win32 GetPrivateProfileString () funkce. Tato funkce hledá soubor s názvem zip.ini (který by byl umístěn v adresáři Windows - obvykle c: \ windows pod Windows 95 nebo c: \ winnt pod Windows NT). Účelem tohoto souboru je udržet cestu, kde je nainstalována aplikace ZIP. JVM v tomto umístění vyhledá soubory classes.zip a třídy aplikací (bez ohledu na to, odkud je aplikace ZIP volána).

Dalším bodem, který si musíte všimnout, je volání na SetConsoleCtrlHandler () Win32 API. Toto API brání stisknutí kláves Ctrl-C nebo Ctrl-Break - kromě jiných událostí - v zastavení aplikace před jejím dokončením. To může nebo nemusí být žádoucí, v závislosti na aplikaci.

Aplikace ZIP je napsána v jazyce Java. Umožňuje uživatelům zobrazit obsah archivních souborů zip a také extrahovat jednotlivé soubory z těchto archivů. Následující výpis obsahuje zdrojový kód do ZIP.

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