Az ndk használata az android stúdióban

Jelenleg az Android-fejlesztők között igen népszerű fejlesztői környezet az Android Studio, amely a JetBrains IntelliJ IDEA-ján alapul. Azonban, ha az IDE e, problémák merülhetnek fel az alkalmazások natív kód Android NDK célja elsősorban a használja az IDE Eclipse és ADT.

Mivel sok cikk van leírva az NDK-val való együttműködést, példaként nem fogom használni a komplex könyvtárakat, de a hello-jni legegyszerűbb példájára korlátozódom. A példa forráskódja megtalálható a <путь_к_ndk>/ minták / hello-jni

Az Eclipse környezetben nem volt különösebb probléma az NDK használatával. A projekt katalógus valami ilyesmit lát:

Az ndk használata az android stúdióban

1. ábra: Az Eclipse fő projektkönyvtára

Érdekelünk a jni és libs könyvtárak iránt. JNI könyvtár tartalmazza a forráskódot, hogy anyanyelvük (* .c; * .cpp), header fájlok (* .h), makefiles (* .mk). Hosszú ideig nem fogok foglalkozni e fájlok céljával, mivel sok anyag és cikk foglalkozik ezzel. Csak azt szeretném megemlíteni, hogy a jni a java natív felületét jelenti. Ez a felület lehetővé teszi, hogy a natív eljárásokat a kódról java-ra hívják. Tehát ne felejtsd el csatlakoztatni a könyvtárat a c / c ++ fájlokba, és emlékezzen a jni által meghívott függvények helyes szintaxisára. Például, az én esetemben az alkalmazásnak van a csomag neve:
evi.ntest
így a függvény leírása így néz ki:

ahol jstring - a név az adatok típusát c, ami megfelel string típusú java, Java - ebben az esetben a szolgáltatás előtag jelzi a nyelvet, amelyen a függvényt nevezzük, evi_ntest - a csomag nevét, amely a függvényt, MainActivity - Íme activiti ahonnan fogják hívni function, stringFromJNI a függvény neve.
A java-kódban a funkció leírása sokkal egyszerűbb:

Ne felejtsd el megadni a használt kódfájlokat az .mk fájlokban. Kezdetektől fogva használhatsz .mk fájlokat az NDK példáiból, módosíthatod a fájlneveket, de a jövőben azt javaslom, hogy tanulmányozzák felépítésüket.

A libs könyvtár előre definiált bináris könyvtárakat tartalmaz különböző processzor architektúrákhoz (alapértelmezés szerint - armeabi). A dinamikus könyvtár egy .so kiterjesztéssel rendelkező fájl, a statikus könyvtár az .a kiterjesztésű fájl. Ezeknek a könyvtáraknak a megszerzéséhez a forrásokat az Android NDK segítségével kell összeállítani. A Unix-rendszereken (esetemben - Mac OSX) erre a terminálon a következő sorokat kell beírni:

Így NDK automatikusan összeállítja forráskódját JNI mappák és helyezi a könyvtár kapott libs / armeabi (szintén alatt lehet beállítani x86 összeállítása parancssori paramétereket, MIP-k, kar V7-neon processzorok).
A Windows használatakor további segédprogramokat, esetleg bővítményeket kell használni az MS Visual Studio programhoz.
Mindenesetre, nem számít, milyen módon készülj könyvtárak fontos az a tény, hogy ha a projekt mappa egy alkönyvtár könyvtárak, Eclipse az összeállítás automatikusan lehetővé teszi a tartalmát a APK-fájlt.

A cikk fő részéhez fordulok - az IDE Android Stúdió beállítása a natív kóddal való együttműködéshez.

Az Android Studio környezet alapértelmezés szerint összegyűjti az APK-t. Ez a gyűjtő széles testreszabási képességekkel rendelkezik, de a standard beállításoknál a stádium nem tartalmazza az APK-fájlban lévő natív könyvtárakat.

Tekintsük a projekt részleges struktúráját az Android Stúdióban:

2. ábra Az Android Studio program forráskódjának elérési útja.

A munka, volt egy logikus vágy, hogy tegyen JNI mappát a src / fő, mert ez az, ahol tárolja az összes többi forrás fájlokat. Természetesen az olvasó keresse JNI könyvtár, ahol ez kényelmes. A legfontosabb dolog - ne felejtsük el, hogy összegyűjti a bináris könyvtár segítségével NDK (ismét egy UNIX rendszer, hogy ezt a terminál megy a könyvtárba tartalmazó JNI, akkor hívja a futtatható fájl NDK-build, fekszik egy mappa a NDK, a teljes elérési útvonalát ugyanazon terminál, MS Windows kell használni kiegészítő eszközök). A probléma az, hogy az alapértelmezett nem Gradle csomagolás APK a könyvtárban.

Azonban a gradel könnyen konfigurálható a java könyvtárak összeállításába (* .jar fájlok). Megjegyzendő, hogy a jar-fájlok zip archívumok, amelyek tartalmaznak minden erőforrást, valamint objektumkódot. Így a bináris könyvtárak * .so és * .a bináris könyvtárakba történő beillesztése elég ahhoz, hogy azokat egy jar fájlba csomagoljuk.
Ez így történik:

  • A bin könyvtárakat tartalmazó libs mappát átnevezheti a lib könyvtárba
  • Ezt a mappát minden zip-archiválóval összenyomjuk
  • Módosítsa a kapott fájl kiterjesztését .jarra

Az így kapott könyvtár is csatlakozik a szerelvény szakaszában a projekt, az így kapott APK-fájl tartalmazza a bináris könyvtárak és alkalmazása - call eljárásokat írt natív kód.
Ezt a problémát többször tárgyalják különböző angol nyelvű fórumokon, például Stack Overflow:

Azonban ez az információ meglehetősen rövid, töredezett, és az olvasónak szüksége van a szintaxis fokozatra vonatkozó ismeretekre. Cikkem célja az, hogy az olvasók részletes orosz nyelvű magyarázatot kapjanak, még azok számára is elérhetővé válnak, akik az Android Stúdióval és a fokhellyel kezdtek dolgozni.

Nézzünk kétféle csomagolási könyvtárt: manuális és automatikus.

Kézi csomagolási módszer:

Ez a módszer nagyon kellemetlen, de létezik. Elfogadható alkalmazási eset a gyakorlatban: a kész könyvtár rendelkezésre állása és nincs szükség változtatásra. Ebben az esetben az alábbiakban leírt műveleteket csak egyszer kell végrehajtani.

Ez a fájl eredetileg így néz ki:

Alul van egy szakasz függőségek. Ehhez hozzá kell adni:

compile fileTree (dir: 'src / main /', tartalmaz: '* .jar')

Ismerkedjen meg a módosított build.gradle fájllal, hogy ne zavarja meg a függőségeket és a buildscript függéseket.

Az olvasó valószínűleg már észrevette, hogy ez a módszer nagyon kényelmetlen jelenlétében szükségességének gyakori változások a natív kód, mert mindegyik után újrafordítás el kell távolítani a régi jar-fájl, nevezze át a mappát a lib könyvtárak, archiválja azt, változtassa meg a fájl kiterjesztését. Ezért használjuk a gradel teljesítményét és automatizálja a folyamatot.

A gradel csomag készítője lehetővé teszi a feladatok (függvények) létrehozását, valamint a különféle típusú archívumok, köztük a zip készítésének képességét. Használjuk ezt és adjuk hozzá a következő sorokat build.gradle (a fájl helyét a fentiekben tárgyaltuk):

a fileTree-ből (dir: "src / main / libs", tartalmazza: '** / *. so')

Használnia kell:

a fileTree-ből (dir: 'src / main / libs', tartalmazzák: '** / *. *')

Ezután adja hozzá a következő sort a függőségekhez:

compile fileTree (dir: "$ buildDir / native-libs", tartalmazza: 'native-libs.jar')

A telepítés során ez a parancs tartalmazza az APK fájlban létrehozott natív-libs.jar könyvtár tartalmát.

Példa erre a build.gradle kódra:

Ha minden rendben van, akkor a projektszerelés során az Android Studio automatikusan létrehozza a megfelelő könyvtárat a build könyvtárban, és bevezeti a kész programba. Így a natív kód minden egyes újrafordítása után nincs szükség további műveletek és beállítások elvégzésére, a gradel mindent megtesz.

Rövid folytatás
  1. Nyissa meg a "<путь_к_проекту>/<имя_проекта>Projekt /<имя_проекта>/ src / main "és hozzon létre egy jni almappát.
  2. Nyissa meg a fájlt "<путь_к_проекту>/<имя_проекта>Projekt /<имя_проекта>/build.gradle ", módosítsa a függőségeket, majd adja hozzá a következő kódot:

A statikus könyvtárak * .a engedélyezéséhez (ha rendelkezésre áll), módosítsa a sort

a fileTree-ből (dir: "src / main / libs", tartalmazza: '** / *. so')

a fileTree-ből (dir: 'src / main / libs', tartalmazzák: '** / *. *')

  • A jni almappában a * .mk, * .h, * .c fájlokat helyezzük el, a natív kódot írjuk.
  • Nyissa meg a "<путь_к_проекту>/<имя_проекта>Projekt /<имя_проекта>/ src / main "a terminálon.
  • Adja meg a terminált a terminálban <путь_к_ndk>/ ndk-build
  • Futtassa a projektet.
  • Fontos!
    Az adott utasítás a Unix operációs rendszerekhez készült (az én esetemben - MacOSX). Az MS Windows operációs rendszer esetében a 4. és az 5. tétel nem releváns, mivel a natív könyvtárak összeállításához további segédprogramok szükségesek. Valószínűleg tanácsos megváltoztatni a könyvtárak tárolásának módját a kényelmesebbek számára, és figyelembe venni a build szkriptben.

    Sikeres az Ön számára a natív programozás, a fő dolog - minden alkalommal ne felejtsd el megkérdezni, hogy érdemes használni a natív kódot. Könnyen lehet, hogy a java-analógok, amelyek használata könnyebb és a legtöbb esetben - ez jobb, mert csökkenti a fejlesztési időt, javítja az érthetőséget más kódra, csökkenti a bonyolultsága az alkalmazás architektúra és a hatalom a modern eszközök is elegendő a legtöbb feladat, még a Dalvik VM.

    Kapcsolódó cikkek