Utilizza C ++ con Android ndk / jni

Tutti i campioni ndk utilizzano solo le funzioni di base C dichiarate come extern nell'intestazione e definite nel file cpp. Poi, dopo aver incluso il file di intestazione nel file C contenente la chiamata di jni, tutto funziona bene.

È ansible utilizzare classi C + + con l'android ndk? La mia applicazione non sarà un'attività nativa, avrà ancora una parte importnte di java ma chiamerà il codice C nativo per il calcolo intensivo della CPU (già scritto in C ++, con classi e altre cose C ++).

  • Come rimuovere il frammento da FragmentPagerAdapter?
  • Tagli di codice nello studio android
  • Come get le risoluzioni videocamera supportte in android?
  • Android come creare file nella memory del telefono
  • Come definire le properties; comuni di android per tutti i moduli che utilizzano gradel
  • submit notifica push con analisi al singolo dispositivo
  • Ecco il mio ciao mondo come strcuture per ora:

    File "first.h"

    #ifndef FIRST_H #define FIRST_H class Test {}; #endif /* FIRST_H */ 

    File "second.cpp"

     #include <jni.h> #include "first.h" #ifdef __cplusplus extern "C" { #endif jint Java_com_example_twolibs_TwoLibs_add( JNIEnv* env, jobject this, jint x, jint y ) { Test t; return 0; } #ifdef __cplusplus } #endif 

    E finalmente Android.mk

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtwolib-second LOCAL_SRC_FILES := second.cpp include $(BUILD_SHARED_LIBRARY) 

    Abbastanza semplice ma non compilare. La trasformazione di second.cpp in un file .c crea un errore quando includa il file di intestazione, immagino che questo sia perché non è un file C ++.

     error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test' 

    La creazione di .cpp solleva il seguente errore:

     make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'. Stop. 

    Qualche idea di come posso fare quella cosa compilare?

    Grazie

  • Android Kotlin creare l'implementazione di class Parcelable dà un errore nel 'override' del metodo writeToParcel
  • Android AsyncTask blocca l'invio della chiave di invio
  • RecyclerView non si annulla la logging dall'adattatore sulla modifica dell'orientamento
  • Come lasciare OnClick nella chiamata dell'adattatore di ListView Funzione di attività
  • Come disegnare un cerchio dopo aver zoomato in android
  • Bitmap di Android salva senza un'area trasparente
  • 6 Solutions collect form web for “Utilizza C ++ con Android ndk / jni”

    È ansible utilizzare C ++ con NDK, ma i file con codice C ++ devono avere estensione .cpp.

    Da ANDROID-MK.html :

    Si noti che l'estensione predefinita per i file di origine C ++ è '.cpp'. È comunque ansible specificare un altro definendo la variabile LOCAL_CPP_EXTENSION. Non dimenticare il punto iniziale (cioè '.cxx' functionrà, ma non 'cxx').

    Dovrai ricompilare tutte le librerie native appositamente per Android. Hai bisogno del codice sorgente per tutte le librerie native di terze parti che intendi utilizzare semplicemente perché normalmente quando compiliamo e colleghiamo queste librerie all'esterno di Android sono collegati a glibc ma purtroppo Android non usa glibc causa di problemi di licenza e performance. Android utilizza una versione annacquata di glibc chiamata libc . Ha nomi di simboli corrispondenti agli glibc per la maggior parte delle funzioni usuali. Ma per quanto so che libc non ha alcune funzionalità legate alle strings e sicuramente non ha posix supporto posix . Se le librerie native utilizzano una qualsiasi delle funzionalità obsolete, dovrai trovare una soluzione per quelle usando funzionalità alternative supportte da libc e codificando le libs in base a queste.

    Inoltre, come ha sottolineato giustamente, dovrai usare l'NDK per interfacere Java (applicazione Android / fwk) al mondo nativo (C ++).

    Anche se questo suona piuttosto semplice nella mia esperienza, la compilazione di librerie native su Android (porting Android) è stata tradizionalmente molto tempo senza alcuna garanzia di successo.

    Sul tuo errore di compilazione, sembra che tu l'hai chiamato innanzitutto "second.c" e rinominato nuovamente in "second.cpp", ma i file degli oggetti hanno ancora il nome "second.c" in loro, prima di compilare (bdk-build) è necessario rimuovere i file * .o e * .d in / cygdrive / c / android-ndk-r5c / samples / two-libs / obj / local / armeabi / objs / twolib-second

    errore: previsto '=', ',', ';', 'asm' o '__ attributo __' prima di 'class'

    Caso classico di mancanza "; prima della parola chiave di class? Immaginare

      int functionname(int p) class X { } ; 

    Questo potrebbe portre al tuo messaggio di compilatore abbastanza facilmente. Un fattore di complicazione comune è quando sembra

      #include "someheader.h" class X { } ; 

    e l'errore si trova nell'ultima dichiarazione all'interno di someheader.h / o qualsiasi file incluso ricorsivamente;

    Correre:

     ndk-build clean 

    dopo aver modificato un errore Android.mk , altrimenti la build potrebbe continuare a fallire anche se hai risolto la configuration.

    Penso che questo sia il significato del OP per questo commento .

    Modifica Android.mk

    Modificare le istanze di LOCAL_SRC_FILES e rimuovere il file ./ dall'inizio di each row.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.