CLI su DalvikVM fallisce su JNI lib

Ho bisogno di eseguire una versione di row di command dell'applicazione java su Android (Sì lo so che non è banale).

Sto cercando di avviarlo usando Dalvikvm, in realtà inizia, ma in qualche modo il mio codice non riesce perché inizia a utilizzare android.util.log e lancia questa exception.

  • Passaggio di dati da un'attività all'altra utilizzando il pacchetto - che non viene visualizzato in seconda attività
  • Come mai millisUntilFinished non riesce a rilevare gli intervalli CountDownTimer esatti?
  • Viste personalizzate Android in Eclipse Visual Editor
  • Lo background ListView diventa nero quando si scorre
  • Vista di frammento di aggiornamento di Android dopo AsyncTask
  • Come passare le variables alla visualizzazione personalizzata Prima di call onDraw ()?
  • java.lang.UnsatisfiedLinkError: println_native at android.util.Log.println_native(Native Method) at android.util.Log.i(Log.java:159) at org.slf4j.impl.AndroidLogger.info(AndroidLogger.java:151) at org.gihon.client.TunnelingClient.<init>(TunnelingClient.java:62) at org.gihon.client.CLI.main(CLI.java:95) at dalvik.system.NativeStart.main(Native Method) 

    Ho provato a impostare le variables di ambiente, ho impostato le LD_LIBRARY_PATH e le variables BOOTCLASSPATH. Ho anche provato a preloading liblog con LD_PRELOAD, ma niente ha risolto quello. Sembra che qualcosa è sbagliato / diverso dal modo in cui il dalvikvm imposta l'ambiente.

  • Studio Android: nuovo progetto vs nuovo module
  • Problema di rendering offscreen / bitmap di WebView WebView
  • Rimuovere l'ascoltatore da ViewTreeObserver
  • Come creare uno stile inbox (con il count dei conteggi) per android?
  • Errore: Protocollo di block imprevisto trovato nel file di block. Atteso 3, trovato 0
  • Differenza tra ActionBarActivity e attività di frammento
  • 2 Solutions collect form web for “CLI su DalvikVM fallisce su JNI lib”

    Buona domanda! Ho dovuto scavare un po 'per capirlo.

    Ci sono una serie di methods JNI in libandroid_runtime.so che non si legano per impostazione predefinita, quando si utilizza il command dalvikvm. Purtroppo non puoi fare solo un sistema.loadLibrary ("android_runtime"), perché in realtà non lega tutti i methods nativi.

    Tuttavia, dopo un certo scavo, si scopre che c'è un interno, non pubblico, non garantito per essere lì class chiamata com.android.internal.util.WithFramework, il cui scopo è quello di caricare libandroid_runtime.so e bind tutti i suoi methods JNI.

    Per usarlo, basta com.android.internal.util.WithFramework davanti al tuo nome di class, sul command dalvikvm, così:

     dalvikvm -cp /some/path/classs.dex com.android.internal.util.WithFramework my.example.cls "This is an argument" 

    (Nota: questo funziona solo su dispositivi pre-M, a causa della class WithFramework rimosso in M – grazie per le teste in su @JaredRummler)

    Per android M, ho trovato questo metodo per funzionare.
    Creare uno script helloworld.sh per accompagnare il file jar \ zip:

     #!/system/bin/sh # Copied by example from am command base=/system export CLASSPATH=/path/to/your/jar/HelloWorld.jar exec app_process $base/bin HelloWorldMainClass "$@" 

    app_process sembra avviare il codice java con tutte le classi Java e le Libe condivise caricate, in modo da poter utilizzare entrambe le classi SDK come android.util.log.LOG E le classi natali "segnetworking", ad esempio ActivityManagerNative, utilizzate in altri comandi di shell adb, e non sono presenti nell'SDK.

    BTW, per il command della shell java che ho creato, wherevo ricorrere all'uso della riflessione per le classi di cui sopra, perché mi sembra che non sia ansible compilare correttamente senza la clonazione e la costruzione dell'integer AOSP …
    Se qualcuno conosce un modo più semplice per usare, ad esempio, ActivityManagerNative nel codice java senza riflessione, apprezzerò l'aiuto.

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