abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 11:00 | Zajímavý článek

Článek (en) na Mozilla.cz je věnován vykreslování stránek ve Firefoxu. V průběhu roku 2018 by se ve Firefoxu měl objevit WebRender, jenž by měl vykreslování stránek urychlit díky využití GPU.

Ladislav Hagara | Komentářů: 0
dnes 08:22 | Bezpečnostní upozornění

NÚKIB (Národní úřad pro kybernetickou a informační bezpečnost) informuje o zranitelnosti ROCA v procesu generování RSA klíčů, který se odehrává v softwarové knihovně implementované například v kryptografických čipových kartách, bezpečnostních tokenech a dalších hardwarových čipech vyrobených společností Infineon Technologies AG. Zranitelnost umožňuje praktický faktorizační útok, při kterém útočník dokáže vypočítat

… více »
Ladislav Hagara | Komentářů: 0
dnes 01:23 | Zajímavý software

Příspěvek na blogu otevřené certifikační autority Let's Encrypt informuje o začlenění podpory protokolu ACME (Automatic Certificate Management Environment) přímo do webového serveru Apache. Klienty ACME lze nahradit novým modulem Apache mod_md. Na vývoj tohoto modulu bylo uvolněno 70 tisíc dolarů z programu Mozilla Open Source Support (MOSS). K rozchození HTTPS na Apache stačí nově přidat do konfiguračního souboru řádek s ManagedDomain. Minutový videonávod na YouTube [reddit].

Ladislav Hagara | Komentářů: 0
včera 14:15 | Komunita

Daniel Stenberg, autor nástroje curl, na svém blogu oznámil, že obdržel letošní Polhemovu cenu, kterou uděluje Švédská inženýrská asociace za „technologickou inovaci nebo důvtipné řešení technického problému“.

marbu | Komentářů: 9
včera 13:40 | Pozvánky

Cílem Social Good Hackathonu, který se uskuteční 21. a 22. října v Brně, je vymyslet a zrealizovat projekty, které pomůžou zlepšit svět kolem nás. Je to unikátní příležitost, jak představit nejrůznější sociální projekty a zrealizovat je, propojit aktivní lidi, zástupce a zástupkyně nevládních organizací a lidi z prostředí IT a designu. Hackathon pořádá brněnská neziskovka Nesehnutí.

… více »
Barbora | Komentářů: 1
včera 00:44 | Pozvánky

V sobotu 21. října 2017 se na půdě Elektrotechnické fakulty ČVUT v Praze uskuteční RT-Summit – setkání vývojářů linuxového jádra a uživatelů jeho real-time verze označované jako preempt-rt.

… více »
Pavel Píša | Komentářů: 8
16.10. 23:44 | Bezpečnostní upozornění

V Linuxu byla nalezena bezpečnostní chyba CVE-2017-15265 zneužitelná k lokální eskalaci práv. Jedná se o chybu v části ALSA (Advanced Linux Sound Architecture).

Ladislav Hagara | Komentářů: 1
16.10. 22:44 | Komunita

Greg Kroah-Hartman informuje na svém blogu, že do zdrojových kódu linuxového jádra bylo přidáno (commit) prohlášení Linux Kernel Enforcement Statement. Zdrojové kódy Linuxu jsou k dispozici pod licencí GPL-2.0. Prohlášení přidává ustanovení z GPL-3.0. Cílem je chránit Linux před patentovými trolly, viz například problém s bývalým vedoucím týmu Netfilter Patrickem McHardym. Více v často kladených otázkách (FAQ).

Ladislav Hagara | Komentářů: 4
16.10. 22:04 | Pozvánky

Rádi bychom vás pozvali na přednášku o frameworku Avocado. Jedná se o testovací framework další generace, inspirovaný Autotestem a moderními vývojovými nástroji, jako je třeba git. Přednáška se bude konat 23. října od 17 hodin na FEL ČVUT (Karlovo náměstí, budova E, auditorium K9 – KN:E 301). Více informací na Facebooku.

… více »
mjedlick | Komentářů: 0
16.10. 21:44 | Bezpečnostní upozornění

Nový útok na WPA2 se nazývá KRACK a postihuje prakticky všechna Wi-Fi zařízení / operační systémy. Využívá manipulace s úvodním handshake. Chyba by měla být softwarově opravitelná, je nutné nainstalovat záplaty operačních systémů a aktualizovat firmware zařízení (až budou). Mezitím je doporučeno používat HTTPS a VPN jako další stupeň ochrany.

Václav HFechs Švirga | Komentářů: 3
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (12%)
 (0%)
 (0%)
 (4%)
 (73%)
 (12%)
Celkem 26 hlasů
 Komentářů: 1, poslední dnes 11:21
    Rozcestník

    Java Native Interface: propojujeme Javu a C/C++ – 2

    10. 11. 2010 | Luboš Doležel | Programování | 4791×

    V druhém díle seriálu se podíváme na ostatní primitivní datové typy a naučíme se pracovat s objekty typu String.
    Java Duke

    Obsah

    V druhém díle seriálu se podíváme na ostatní primitivní datové typy a naučíme se pracovat s objekty typu String.

    Primitivní datové typy

    link

    V ukázce v minulém díle jste si mohli všimnout, že se v nativním kódu místo typu int používalo jint. Situace je taková, že se velikost datových typů může mezi Javou a C/C++ lišit, a proto byla zavedena tato značení typů. V případě jint půjde typicky ve výsledku jen o #define na int, protože většina kompilátorů má int 32bitový, ale s javovským longem už je to o trochu složitější.

    Typ v JavěTyp v JNITyp v C/C++IdentifikátorPoznámka
    boolean jboolean unsigned char (bool) Z Pro kompatibilitu s C není použit bool z C++
    byte jbyte unsigned char B
    char jchar unsigned short (wchar_t) C Java pro znaky používá kódování UTF-16 (dříve UCS-2)
    short jshort short (int16_t) S
    int jint int (int32_t) I Staré C kompilátory měly int 16bitový, definice typů je v C dosti vágní
    long jlong long long (int64_t) J Pozor, velikost long se v C typicky liší podle velikosti ukazatele na platformě, proto long long
    float jfloat float F 32bitové desetinné číslo
    double jdouble double D 64bitové desetinné číslo

    Protože Java podporuje přetěžování metod, mají všechny datové typy v Javě svůj identifikátor, který se používá při "dekoraci" názvů metod o signaturu pro nalezení té správné přetížené varianty. Sami si s identifikátory budeme hrát až v dalších dílech. Do té doby můžeme tyto identifikátory zahlédnout v hlavičkových souborech generovaných programem javah.

    Objekty v JNI

    link

    Všechny javovské objekty jsou v JNI reprezentovány jako jobject nebo jako potomek této třídy. Samotný typ jobject je ve skutečnosti jen #definovaný ukazatel (_jobject*), proto se při kopírování jobjectu nevolají žádné konstruktory nebo něco podobného. Každý jobject přitom představuje z hlediska Javy pouze referenci na objekt, to znamená, že dva jobjecty s odlišnou adresou mohou ve skutečnosti zastupovat ten samý javovský objekt, který bude předmětem garbage collection, jakmile budou všechny reference na něj zrušeny.

    Pro odchycení některých základních programátorských chyb obsahuje JNI potomky jobjectu. Především proto, aby bylo jasné, že daná funkce JNI požaduje objekt právě takového typu. Veškerá pole (i primitivních hodnot) jsou také objekt – castování pole na Object v Javě by sice člověka možná praštilo do očí, ale i zde se ukazuje, že je to skutečnost.

    Typ v JNI Typ v Javě
    jobject java.lang.Object (instance libovolné třídy)
    jstring java.lang.String
    jclass java.lang.Class
    jthrowable java.lang.Throwable
    jarray (a příbuzní jako jintArray) type[] (pole primitivních hodnot nebo objektů)
    jweak speciální typ pro slabé globální reference, odpovídá java.lang.ref.WeakReference

    Pracujeme s řetězci

    link

    Konečně se dostáváme k vytvoření našeho prvního řetězce. Řetězce mají v Javě speciální postavení a není tomu naštěstí jinak ani v JNI. Díky tomu nemusíme vytvářet instance java.lang.String a ručně volat konstrukor, což by bylo poněkud pracné. Upravíme si tedy příklad z přechozího dílu a naprogramujeme si dvě nativní metody: jedna bude číslo převádět na řetězec a druhá zase naopak. Javovská třída:

    package test;
    
    public class TestNative {
        public static native String intToString(int number);
        public static native int stringToInt(String str);
    
        public static void main(String[] args) {
            System.loadLibrary("mynative");
    
            int number = 567;
            String str = "321";
    
            System.out.println("intToString(): " + intToString(number));
            System.out.println("stringToInt(): " + stringToInt(str));
        }
    }
    

    Na straně nativního kódu se už konečně dostane ke slovu pomyslná brána k JNI, tedy JNIEnv*. Vygenerujeme si nový hlavičkový soubor pomocí javah a začneme implementovat. Nejprve se podíváme na odlišnost volání metod JNI mezi C a C++ – díky podpoře OOP v C++ je zde práce snazší. V mých příkladech budu i z tohoto důvodu používat styl C++.

    /*
    Máme nějaký objekt env:
    extern JNIEnv* env;
    */
    
    /* Takto voláme funkce JNI v jazyce C: */
    (*env)->funkce(env, arg1, arg2);
    
    /* Takto voláme funkce JNI v jazyce C++: */
    env->funkce(arg1, arg2);
    

    Přejděme tedy k práci a podívejme se na implementaci intToString a stringToInt:

    jstring Java_test_TestNative_intToString(JNIEnv* env, jclass myClass, jint num)
    {
        char buf[50];
        snprintf(buf, 50, "%d", num);
    
        jstring str = env->NewStringUTF(buf);
        return str;
    }
    
    jint Java_test_TestNative_stringToInt(JNIEnv* env, jclass myClass, jstring str)
    {
        const char* cstr;
        int num;
    
        cstr = env->GetStringUTFChars(str, NULL);
        num = atoi(cstr);
        env->ReleaseStringUTFChars(str, cstr);
    
        return num;
    }
    

    Použili jsme tři funkce JNI, které si popíšeme:

    • jstring NewStringUTF(const char* str)

      Vrátí novou lokální referenci na instanci java.lang.String s obsahem UTF-8 řetězce, na který odkazuje str. Existuje také varianta NewString(const jchar*, jsize length), která pracuje s řetězci v UTF-16. Tato lokální reference bude v tomto příkladu zrušena při návratu funkce, respektive bude nahrazena jinou referencí ve volající metodě, pokud si vrácenou hodnotu uchovává.

    • const jbyte* GetStringUTFChars(jstring str, jboolean* isCopy)

      Vrátí ukazatel na UTF-8 řetězec s obsahem předaného Stringu. Pokud isCopy není NULL, je nastaveno na JNI_TRUE, nebo JNI_FALSE podle toho, zda bylo nutné vytvořit kopii dat retězce. Dvě pravidla: do vráceného řetězce nesmíte zapisovat a musíte jej uvolnit pomocí ReleaseStringUTFChars. Existuje také varianta GetStringChars, která vrací řetězec v UTF-16.

    • void ReleaseStringUTFChars(jstring str, const jbyte* cstr)

      Uvolní paměť daného C řetězce. Existuje také varianta ReleaseStringChars, která se používá spolu s GetStringChars.

    Na Linuxu budeme chtít používat hlavně funkce spojené s UTF-8; na Windows může být výhodnější používat funkce vracející UTF-16, protože Unicode varianta WinAPI používá právě toto kódování. Na rozdíl od C/C++ jsou řetězce v Javě vždy konstantní, to znamená, že se jejich obsah nemůže od založení do zrušení objektu měnit. Tím pádem jen marně můžeme hledat takové funkce.

    V dokumentaci najdeme ještě několik dalších funkcí pro práci s řetězci:

    • GetStringLength – vrátí délku Stringu v počtu Unicode znaků
    • GetStringUTFLength – vrátí bajtovou délku UTF-8 reprezentace řetězce
    • GetStringRegion a GetStringUTFRegion – zapíší určitou část řetězce do námi dodaného bufferu
    • GetStringCritical a ReleaseStringCritical – slouží pro přímý přístup k UTF-16 bufferu daného Stringu. Vyplatí se při práci s dlouhými řetězci (obsah se typicky nemusí kopírovat), ale má přísnější pravidla: mezi Get a Release se nesmí volat funkce JNI a náš kód nesmí blokovat, neboť by mohl blokovat i další části JVM.

    Nyní zkompilujeme naší nativní knihovnu a pak spustíme javovský program:

    $ java -Djava.library.path=/tmp -cp build/classes test.TestNative
    intToString(): 567
    stringToInt(): 321
    

    Co bude příště

    link

    V příštím díle se naučíme pracovat s lokálními a globálními referencemi na javovské objekty.

           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    10.11.2010 10:42 Palo
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Nepouzivajte JNI. Ak to skutocne potrebujete napiste si nieco v C/C++ a potom cez File pipe, siet, ... si to transferujte do Javy kde to spracujete.
    D.A.Tiger avatar 10.11.2010 12:12 D.A.Tiger | skóre: 8 | Brno
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Proč? Není to přece jen pracnější? Pokud zpracováváš jednoduché typy v jednoduchém prográmku, tak by to bylo řešitelné, ale co když potřebuješ transfer a zpracování složitejších objektu? Nebo použít nějakou C/C++ knihovnu? To jako budeš dělat kvůli tomu special wraper, který bude komunikovat s javovskými aplikacemi?
    Radost z toho, že někdo objeví něco nového, je omyl starý 6000 let... (Jean Paul) | anthill inside
    10.11.2010 13:15 Palo
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Odpoved preco nepouzivat JNI najdete aj tu: http://en.wikipedia.org/wiki/Java_Native_Interface

    Myslim ze s polkou z nich som sa stretol priamo nazivo. Hlavne stabilita JVM dost trpi.

    Ten specialny wrapper iste nebude komplikovanejsi nez na co narazis pri integracii Javy s C/C++ kniznicami.
    Luboš Doležel (Doli) avatar 10.11.2010 14:04 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Přečetl jsem si to a jde o problémy, které jsou pro programátory nativních aplikací každodenní chéb. Prostě když píšu nativní kód, tak musím napsat nativní kód tak, aby nedělal blbosti - nehavaroval, uvolňoval paměť a hlídal chyby. Nic nečekaného.
    12.11.2010 13:39 Palo
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Take zamyslenie. Na co by som potreboval spustat nativny kod? Na siet, subory, seriovu linku a kopec dalsich veci sa dostanem odladenym (tiez nativnym) kodom priamo z JVM. Takze na co by som potreboval C/C++. Na pristup k nejakym hroznym zdrojom ktore maju nepredvidatelne spravanie takze aj ten C/C++ bude mat nepredvidatelne (chybne) spravanie. A preto je dobre mat to mimo vlastneho memory space java programu ktory to spracovava. Tuto chybovu cast urobit ako maly program ktory feeduje velky Javovy program. Problem s protokolom alebo niecim podobnym nevidim. Na to existuje velke mnozstvo kniznic. Akekolvek ine riesenie ktore umoznuje bezat C/C++ mimo memory space Javy je lepsie ako bezat nativny kod z Javy. Dokonca aj spustenie externeho programu a citanie a zapis na STDIN/STDOUT je radovo lepsi sposob. Nebranim samozrejme nikomu v experimentovani a robeni vlastnych chyb. Toto su moje skusenosti a odporucania. JNI nikdy viac.
    Luboš Doležel (Doli) avatar 12.11.2010 14:28 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Na pristup k nejakym hroznym zdrojom ktore maju nepredvidatelne spravanie takze aj ten C/C++ bude mat nepredvidatelne (chybne) spravanie.
    Tak to ano, ale v takové situaci by se dělalo oddělení stranou i u nativních aplikací. Já využití vidím v přístupu k nativním knihovnám jako SQLite (bylo by hloupé to reimplementovat v Javě, ano, znám JDBC, je to jen příklad), Qt, GTK+, ffmpeg nebo různým platformně specifickým věcem (XVideo).
    12.11.2010 16:58 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Ten „hrozný zdroj s nepředvídatelným chováním“ může být třeba linuxové jádro. Pokud budete chtít nějakou jeho funkci (která není jinak z Javy dostupná) volat často, může být výkon spotřebovaný navíc pro nějakou síťovou komunikaci nebo dokonce spouštění nových procesů nezanedbatelný. Jako příklad si představte třeba web server, který bude mime typ souboru zjišťovat z rozšířených atributů souboru (ke kterým se před Javou 7 jinak, než nativním voláním, nedostanete).
    12.11.2010 20:41 pepa_u
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Ona je bohuzel hromada knihoven, ktere v Jave neexistuji. Komunikovat s nimi pres sit, stdin/out a nebo neco podobneho by bylo pri nejmensim neefektivni.

    Ja pozivam CERN ROOT knihovny z Javy pres JNI, vse jsem odladil, nenam nejmensi problem. Zpracovavam GB dat, fituju funkce, atd atd, vsecko s pomoci C++ knihovny ROOT volane z Javy. A co vic, funguje to prez problemu na Linuxu, Mac OS X i Windows.
    Algi avatar 18.11.2010 15:19 Algi | skóre: 1 | blog: Sinner
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Take zamyslenie. Na co by som potreboval spustat nativny kod?
    Odpověď je naprosto triviální. Volitelná integrace s určitýma nativníma knihovnama/frameworkama. Konkrétní příklad z praxe? AddressBook.framework - volání jeho API z Javy je jednoduché a efektivní. Dvě otázky, kterými byste mohl oponovat:

    1) Proč volat framework dostupný pouze na jednom OS? 2) Proč si nenapsat obdobnou funkcionalitu v Javě?

    Moje zdůvodnění bylo prosté. Proč ne, když je to k dispozici. Lépe tam ta aplikace zapadá a nebudu znovu vynalézat kolo. Při pečlivém a správném napsání nativního kódu (bez použití JNA) nebyl jediný problém. Uznávám, daný kód byl vcelku jednoduchý a moc šancí na chybu v něm nebylo. Nicméně z části to bylo dáno také volbou nativního jazyka Objective-C.
    I'm a firestarter, twisted firestarter...
    Luboš Doležel (Doli) avatar 10.11.2010 12:17 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Chtěl bych vidět, jak by to takhle dělali třeba v OpenOffice.org. To by bylo šílený.
    10.11.2010 13:20 Palo
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    To co predvadzaju pri spajani Javy s OpenOffice je dost sialene aj teraz. Ja nemam nic proti spustaniu Javy z C/C++ ako nejakym callbackom to je fajn a dokonca aj velmi rychle. Ale cele toto JNI je nanic.
    D.A.Tiger avatar 10.11.2010 23:05 D.A.Tiger | skóre: 8 | Brno
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Ja nemam nic proti spustaniu Javy z C/C++
    Pokud jsem to pochopil zprávně, ta JNI pracuje přesně opačně - umožňuje použít C/C++ kod v Javě.
    Radost z toho, že někdo objeví něco nového, je omyl starý 6000 let... (Jean Paul) | anthill inside
    Luboš Doležel (Doli) avatar 10.11.2010 23:30 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Funguje oběma směry. Budu to později v tomto seriálu také ukazovat.
    11.11.2010 18:00 arny
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Pekny clanok. Privital by som, ked ukoncite popisovanie JNI, clanky aj o JNA (Java Native API), ktore podla mna zlahcuje integraciu nativneho kodu s javou. Je to nieco podobne ako P/Invoke v .NETe (spominam to tu hlavne preto aby sa .NETatci priliz nevychvalovali ;)).
    11.11.2010 18:01 arny
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    prepacte za omyl, JNA = Java Native Access
    Luboš Doležel (Doli) avatar 11.11.2010 21:43 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    Až bude probrané JNI komplet, přijde řada i na JNA.
    12.11.2010 12:44 Canibal
    Rozbalit Rozbalit vše Re: Java Native Interface: propojujeme Javu a C/C++ – 2
    U nas jsem poizivali na propojeni Javy C++ super vec:

    http://sourceforge.net/projects/jace/

    Je to proxy generator C++ -> Java /zpet. Muzu jen doporucit. (Pred 2 roky nepodporovali wchar (bylo nutne dodelat), ale myslim, ze uz to maji).

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.