2011-12-08 17 views
5

Ho un oggetto condiviso, che chiamerò 'libFoo.so', compilato contro l'NDK. Ho un progetto java (lo chiamerò 'jarlib') che fa uso di tale oggetto condiviso, chiamandoCome caricare un oggetto nativo condiviso, in un barattolo, da un'applicazione Android?

System.loadLibrary("Foo"); 

Quel progetto java, ho esportare come un vaso, e utilizzare in un'applicazione Android. Se commento tutti i bit sull'oggetto condiviso, il barattolo funziona bene e sono in grado di interagire perfettamente con esso.

Posso usare jarlib, insieme all'oggetto condiviso da un'applicazione Android Unity con l'oggetto condiviso in ./lib/armeabi/libFoo.so, e lo carica su tutto peachy.

Sto provando a utilizzare jarlib e libFoo.so nella mia app Android non unità, e loadLibrary si rifiuta assolutamente di trovare libFoo.so. Ho provato a posizionarlo in modo che sia incluso nel mio apk in ./lib, così come ./lib/armeabi, e niente sembra far sì che la chiamata di caricamento lo veda.

Ho provato compreso il libFoo.so in ./lib o ./lib/armeabi del jarlib, ma una volta che provo ad installare/correre la mia app Android, mi hanno detto:

The library 'jarlib.jar' contains native libraries that will not run on the device. 
The following libraries were found: 
    - libFoo.so 

con questo, se è nel ./lib (non ./lib/armeabi)

Additionally some of those libraries will interfer with the installation of the application because of their location in lib/ 
lib/ is reserved for NDK libraries. 

non sono sicuro di quale combinazione che mi manca, ma sono sicuro che si può fare, ho solo non riesco a capire come farlo!

risposta

6

Bene! Si è scoperto che era qualcosa di così piccolo, che mi ha causato otto ore di mal di testa.

Ho trovato che il mio libFoo.so non si presentava nel mio app.apk/lib/armeabi/libFoo.so come quando l'unità ha costruito gli apk. Ho pensato che avesse qualcosa a che fare con questo, così ho iniziato a cercare le impostazioni per assicurarmi che la mia cartella lib fosse stata copiata nell'apk.

Come si è visto, la cartella lib non è, però ...

Ricordate come ho detto ho provato a (sul lato applicazione Android):

./lib/libFoo.so 
-and- 
./lib/armeabi/libFoo.so 

scopre, cosa Dovevo fare era metterlo in un percorso simile. Oh così simile.

./libs/armeabi/libFoo.so 

Sì. librerie. Con un s.

Infatti, quando ho rinominato la mia cartella 'lib' in 'libs', ha cambiato l'icona della cartella in eclissi per avere su di esso il piccolo simbolo di Android, come il bin o le cartelle res. E sicuramente, quando costruisci l'apk, la cartella lib/armeabi è lì (si noti che è denominata 'lib' nell'apk e non in 'libs'. Questo mi confonde ancora.)

Uno dei miei collaboratori (che stava lavorando a questo progetto prima di me) mi ha detto che da qualche parte lungo la linea, la cartella era "lib", ma poi è stata cambiata in "libs" in una versione successiva di Android SDK. Ad ogni modo, avendo appena preso questo progetto, non mi ero reso conto che la cartella avrebbe dovuto essere chiamata "lib", come mi sembrava soddisfacente. Ero quasi pronto a tirarmi fuori i capelli. Lascio questo qui nella speranza che QUALCUNO abbia lo stesso problema che ho fatto e riesca a risolverlo un po 'più velocemente.

Problemi correlati