android-ndkAan de slag met android-ndk


Opmerkingen

Wat is de Android NDK?

Android Native Development Kit (NDK) is een hulpmiddel voor Android SDK waarmee delen van apps kunnen worden ingebouwd in C / C ++. Dit is handig voor:

  • Applicatiecomponenten delen over platforms (Android, iOS, Linux, etc.)
  • Verbetering van de prestaties voor kritieke porties
  • Bestaande C / C ++ -bibliotheken opnieuw gebruiken

De NDK biedt headers en bibliotheken waarmee de ontwikkelaar activiteiten kan bouwen, gebruikersinvoer kan verwerken, hardwaresensoren kan gebruiken, toegang heeft tot toepassingsbronnen en meer - al die tijd programmeren in C / C ++.

versies

Versie Publicatiedatum
r12 2016/06/09
r11 2016/03/09
r10 2014/07/01

Aan de slag met Android NDK met eenvoudig voorbeeld

Met Android Studio 2.2 en hoger Native Development Kit (NDK) kunt u C- en C ++ -code compileren.

U kunt NDK gebruiken door NDK handmatig te downloaden en te bouwen of via CMake.

Hier geef ik een processtroom voor het handmatig installeren van NDK en een voorbeeldcode,

Op basis van uw systeem-besturingssysteem kunt u NDK downloaden vanaf deze locatie https://developer.android.com/ndk/downloads/index.html .

Geef na het downloaden het pad in Systeemomgevingsvariabele als variabelenaam " NDK_PROJECT_PATH " en variabele waarde "locatie van opgeslagen NDK-pad".

  • Vervolgens, om NDK te integreren met Android Studio, na het maken van een nieuw Android-project,

    In gradle - lokale eigenschappen voegen locatie van sdk-pad toe

     sdk.dir=F\:\\gowtham\\Android\\sdk
     

    en

      android.useDeprecatedNdk = true
     
  • Druk vervolgens op Build - Project maken (Ctrl + f9).

    Uw project zal met succes worden gebouwd en zal GEBOUWD SUCCESVOL worden in bericht gradle build, zoals hieronder getoond

voer hier de afbeeldingsbeschrijving in

Vervolgens bevat het in Terminal aanvankelijk het pad van het project

Voeg daar een cd app/src/main

Pad loopt van projectpad naar main.

Vervolgens opnieuw Build - Make Project (Ctrl + f9).

Nu vindt u onder de app-build – tussenproducten – klassen-foutopsporingsmap , zoals hieronder weergegeven.

voer hier de afbeeldingsbeschrijving in

Maak nu een nieuw Java Class-bestand onder een app / src / main / java, hier heb ik een java-bestand gemaakt met de naam NativeClass

voer hier de afbeeldingsbeschrijving in

Schrijf een eenvoudige roepende functie met functienaam en invoer voor de functie, hier heb ik de functie als voorbeeld geschreven en er twee gehele getallen aan gegeven,

voer hier de afbeeldingsbeschrijving in

Bouw opnieuw het project (Ctrl + f9) ,

Wanneer je bouwt, zul je het klassenbestand vinden dat is gemaakt onder build als volgt,

voer hier de afbeeldingsbeschrijving in

Then,in terminal 
    `-Javah  -d  jni –classpath ../../build/intermediates/classes/debug`application.com.ndkapplication.NativeClass
 

waar, - d - voor uitvoermap - jni -Generate JNI-stijl headerbestand (standaard) - classpath - waarvoor klassen worden geladen

Bouw nu het project (Ctrl + f9), u zult een jni- map vinden die is gemaakt en een koptekstbestand met de naam die u eerder in terminal hebt opgegeven, zoals hieronder wordt weergegeven

voer hier de afbeeldingsbeschrijving in

Kopieer nu het koptekstbestand en sla het op als .cpp- of .c- bestand met dezelfde naam van het koptekstbestand in de jni-map.

Ik heb een cpp-bestand gemaakt zoals hieronder wordt weergegeven

voer hier de afbeeldingsbeschrijving in

Delete everything before **JNIEXPORT line** in this file and **add header file name** alone.
Here I am for simple example just adding two numbers and returning value to android java.
 

Application_com_ndkapplication_NativeClass.cpp

 #include <application_com_ndkapplication_NativeClass.h>

JNIEXPORT jint JNICALL Java_application_com_ndkapplication_NativeClass_example
  (JNIEnv *, jclass , jint as , jint bs){

    return (as + bs);

    }
 

En voor dit voorbeeld is het niet nodig om een functie toe te voegen aan het headerbestand.

Maak een nieuw bestand met de naam Android.mk en Application.mk in JNI map

Het Android.mk-bestand beschrijft uw bronnen voor het buildsysteem.

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := application_com_ndkapplication_NativeClass.cpp

LOCAL_LDLIBS += -llog

LOCAL_MODULE := exp-jni

include $(BUILD_SHARED_LIBRARY)
 

voor meer informatie over dit bestand, lees via deze link https://developer.android.com/ndk/guides/android_mk.html

voer hier de afbeeldingsbeschrijving in

Application.mk die de native modules beschrijft die uw app vereist.

Application.mk

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti –fexceptions

APP_ABI := armeabi-v7a armeabi arm64-v8a mips mips64 x86 x86_64

APP_PLATFORM := android-16
 

voor meer informatie over dit bestand, lees via deze link https://developer.android.com/ndk/guides/application_mk.html

voer hier de afbeeldingsbeschrijving in

 Now build the project again **(Ctrl + f9)**, you will find the **armeabi-v7a, armeabi, arm64-v8a ,mips, mips64, x86 and x86_64** folder created inside jniLibs.
 

Geef vervolgens in hoofdactiviteit de invoer door en ontvang uitvoer voor native class-bestand.

int a = 5, b = 5, res ;

res = NativeClass.example(((int) a),((int) b));

TextView textView = (TextView) this.findViewById(R.id.tv);

textView.setText(new Integer(res).toString());
 

hier gaf ik twee gehele getallen input via a, b en krijg output van variabele res.

En verkregen uitvoer wordt op het scherm weergegeven door naar TextView te gaan.

En vergeet niet om de bibliotheek die u in het Android.mk- bestand heeft opgegeven als LOCAL_MODULE op deze manier toe te voegen,

static {
        System.loadLibrary("exp-jni");
  }
 

Bouw ten slotte het project opnieuw (Ctrl + f9), u vindt de .so-bestanden die zijn gemaakt onder elke map armeabi-v7a, armeabi, arm64-v8a, mips, mips64, x86 en x86_64.

voer hier de afbeeldingsbeschrijving in

Voer nu de toepassing uit, u krijgt voor dit voorbeeld uitvoer als 10.

voer hier de afbeeldingsbeschrijving in

Dit is een basisprogramma voor NDK-beginners, de OpenCV-bibliotheek kan hier worden geïmporteerd en u kunt ook beeldverwerkingstoepassingen uitvoeren.