2011-02-03 11 views
41

Sto creando un widget che forniremo agli utenti finali dello sviluppatore e consiste in uno .jar e una libreria nativa (.so) creata utilizzando l'NDK. Il JAR ha un'interfaccia JNI per la libreria dinamica.Creazione di un prodotto SDK: come posso aggiungere una lib nativa (.so) e un jar con l'SDK che sto creando?

È molto chiaro su come includere un .jar esterno in un progetto, ma non su come includere una libreria dinamica dipendente.

  1. Che tipo di imballaggio e costruire il .jar e .so? Quali sono le migliori pratiche qui?

  2. Posso creare il file JAR utilizzando il comando jar di JDK. Devo eseguire dx.bat sul jar per convertire in bytecode Dalvik?

  3. Ho bisogno di creare un progetto di esempio che mostri il widget in azione. Come posso includere questo .jar e .so in un progetto di esempio che dimostra come utilizzare il widget?

risposta

10

È necessario utilizzare gli strumenti di sviluppo standard inclusi con SDK per questo. Se includi i file .jar necessari nella directory /lib del tuo progetto, il processo ant form convertirà i file della classe inclusa nel formato bytecode Dalvik e li includerà nel tuo file classes.dex per l'app. Aggiungere un file build.properties al radice del progetto e, con una sola riga:

external.libs.dir=lib

A seconda della versione del SDK e la configurazione di esso, potrebbe essere necessario posizionare il vaso in libs piuttosto che lib.

Per quanto riguarda il file .so, presumo che sia stato compilato correttamente utilizzando l'NDK di Android o utilizzando uno script di compilazione che utilizza il compilatore e i flag del compilatore corretti necessari per collegare correttamente l'oggetto condiviso su Android. In questo caso, è possibile includere il file .so in libs/armeabi e verranno aggiunti anche nel jar. Inoltre, il caricatore di librerie dinamico saprà di cercare in questa posizione nel file .jar quando si tenta effettivamente di caricare la libreria dal codice Java.

+0

Questo tipo di ha funzionato. Avevo bisogno di usare la cartella LIBS per il mio JAR ma stavo ottenendo errori di compilazione sui tipi mancanti. Eclipse voleva che "aggiustassi il progetto" aggiungendo il progetto della biblioteca al mio progetto di esempio. Cos'altro posso provare? –

+0

Se si fa riferimento al jar dal progetto di esempio, è effettivamente necessario aggiungere il jar al progetto di esempio, in modo che sappia dove trovare le definizioni dei tipi. Puoi aggiungere una linea direttamente al tuo file .classpath che assomigli a '' o vai alla sezione ** Java Build Path ** del tuo progetto proprietà, sotto la scheda ** Librerie ** e aggiungila usando il pulsante ** Aggiungi JAR ... **. –

+0

Sto cercando di includere un file .so nel mio JAR e sto scoprendo che il progetto client non verrà più creato. 'La libreria 'foo.jar' contiene librerie native che non verranno eseguite sul dispositivo. Sono state trovate le seguenti librerie: libs/armeabi/libfoo.so' Secondo l'SDK Tech Lead di Android Xavier Ducrohet, che pesa su [questo thread sul gruppo Google NDK] (http://groups.google.com/group/ android-ndk/browse_thread/thread/bb5bfae006a9c8a2/6aeb6c655b9a4bbd? # 6aeb6c655b9a4bbd) hanno aggiunto un controllo per il codice nativo nei JAR inclusi – Kevin

8

Utilizzando ADT 12, ho compiuto questo nel modo seguente:

1) Esportazione JAR dalla libreria con il SO di file con Eclipse. Assicurati di escludere AndroidManifest.xml. Ciò includerà il codice sorgente e altri dati, quindi se stai distribuendo, ti consigliamo di eliminare questi bit non necessari utilizzando qualsiasi utilità ZIP.

2) Creare una directory nell'albero dei sorgenti dell'app (io uso la directory "lib") e copiare la libreria JAR su di essa.

3) Fare clic con il tasto destro del mouse su progetto in Eclipse e selezionare "Configura percorso di creazione". Aggiungi JAR e puntalo verso JAR all'interno del tuo albero di sorgenti App.

4) Nelle preferenze Eclipse, selezionare la sezione Android/Build e deselezionare "Aggiorna automaticamente la cartella Risorse e risorse su build". Noterai un'opzione sottostante che dice "Forza errore quando i jar esterni contengono librerie native". Esiste un bug ADT, che verrà probabilmente corretto in R17, che utilizza l'impostazione sbagliata. Una volta risolto, utilizzerai l'errore "Forza errore" (assicurati che sia deselezionato).

5) Una volta creato l'APK dell'app, si avrà un file libs/armeabi/libXXXX.so. Questo non verrà automaticamente decompresso al momento dell'installazione. Dovrai scrivere codice per estrarlo dal tuo file APK nella tua directory dei dati, quindi utilizzare System.load sul file .so nella directory dei dati.

Ho le chiamate JNI bidirezionali che vanno dal file caricato dinamicamente e anche usare dlopen() su di esso per fare la mia roba di registrazione del plugin personalizzato.

+0

Come scrivere codice per estrarre il file dal file apk. Ho già aggiunto il file così al jar. Grazie mille per il vostro aiuto. –

+0

Purtroppo, non ho più accesso a questo codice, ed è passato così tanto tempo che ho dimenticato la maggior parte dei dettagli. Ma dal momento che un APK è un file ZIP, qualsiasi libreria ZIP dovrebbe essere in grado di gestirlo per te. In bocca al lupo. – n8n8baby

23

Ho passato un po 'di tempo su questo, e proprio non riesco a capire perché non è scritto sulla documentazione di wikitude .... comunque segui questi cambiamenti!

  • andare a finestre/preferences/android/costruire
  • deselezionare la prima e la seconda opzione
  • file estratto dal wikitudesdk.jar con winrar come se si tratta di un archivio, cercare libarchitect.so e copiarlo in/libs/librerie/armeabi/
  • add wikitudesdk.jar al percorso di generazione

enter image description here

+0

molte grazie amico –

1

Aggiungere le righe seguenti a android.mk.

include $(BUILD_PACKAGE) 

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := alias:libs/your.jar 

include $(BUILD_MULTI_PREBUILT) 
Problemi correlati