Come call i methods Java da C ++ in JNI

Quindi scrivo un'applicazione Android che utilizza una grande libreria c ++. Ho tutto funzionante in modo che l'app java possa call i methods di delegazione c ++, ma mi trovo che desidero poter registrare i messaggi da c ++ al log di Android. Questo è facile da java, ma sono in una perdita per come call un metodo java da c ++. Le mie ricerche hanno trovato i methods per aprire un jvm da c ++, che non è affatto quello che voglio fare. Idealmente, vorrei passare un puntatore di metodo di log a c ++, che potrebbe essere utilizzato each volta che volevo. Naturalmente, java non support i puntatori di metodo. Il mio metodo java sarebbe qualcosa di simile:

private void log(String s){ Log.i(Tag, s); // Android log } 

Non so come permettere a c ++ di accedere a questo metodo.

  • Quali sono le icone Alpha solo?
  • Visualizzazione di ViewPager prima e prima dell'anteprima dell'articolo sullo schermo
  • Arresto di Android ViewGroup: tentativo di leggere dal field 'int android.view.View.mViewFlags' in un riferimento di null object
  • BroadcastReceiver con più filtri o più BroadcastReceivers?
  • come scrivere l'exception nel file di log utilizzando android?
  • Accesso Android con Facebook SDK 4.0
  • Come autofocus la camera Android automaticamente?
  • Come submit i dati alla printingnte Bluetooth o all'applicazione Android?
  • App Engine collegato Android: non riesce a far funzionare correttamente il progetto di esempio
  • Dividere un singolo clic e un doppio click di un imageView in android
  • Come risolvere: "HAX non funziona e l'emulatore viene eseguito in modalità di emulazione"
  • Il contenuto della scheda ActionBar si sovrappone
  • 2 Solutions collect form web for “Come call i methods Java da C ++ in JNI”

    Le chiamate C ++ a cout e printf non verranno visualizzate nell'output LogCat. Ci sono due soluzioni.

    1. Utilizzare le macro di logging fornite dalla NDK che consentono di registrare i messaggi in LogCat. Questo è buono per il codice nuovo e il codice di avvolgimento che stai scrivendo, ma non è così buono quando disponi di una libreria piena di dichiarazioni di debug esistenti. Definisco le macro come segue:

       #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info) #define LOG_ERROR(error) __android_log_write(ANDROID_LOG_ERROR,"JNI",error) 

      e poi all'interno del codice sorgente posso call LOG_INFO("Library is called!");

    2. Cattura l'errore standard / errore standard del programma e lo imbuto in LogCat. Dalla pagina Bridge del debug Android :

      Visualizzazione di stdout e stderr

      Per impostazione predefinita, il sistema Android invia stdout e stderr (System.out e System.err) a / dev / null. Nei processi che eseguono il Dalvik VM, è ansible che il sistema scrivi una copia dell'output al file di registro. In questo caso, il sistema scrive i messaggi nel log utilizzando i tag di log stdout e stderr, entrambi con priorità I.

      Per percorrere l'output in questo modo, si arresta un'istanza di emulatore / dispositivo corrente e quindi utilizza il command setprop per shell per abilitare il reindirizzamento dell'output. Ecco come lo fai:

        $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 

      Il sistema mantiene questa impostazione finché non si termina l'istanza dell'emulatore / dispositivo. Per utilizzare l'impostazione come default nell'istanza dell'emulatore / dispositivo, è ansible aggiungere una voce a /data/local.prop sul dispositivo.

    La logging viene inserita nel file di intestazione "#include".

    Per colbind .so, posiziona 'LOCAL_LDLIBS: = -L $ (SYSROOT) / usr / lib -llog' al tuo file make.

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