2011-12-08 10 views
5

Tengo un objeto compartido, que llamaré 'libFoo.so', compilado contra el NDK. Tengo un proyecto de Java (lo llamaré 'jarlib') que hace uso de ese objeto compartido, llamandoCómo cargar un objeto compartido nativo, en un contenedor, desde una aplicación de Android?

System.loadLibrary("Foo"); 

Ese proyecto java, me exportar como un frasco, y el uso de una aplicación Android. Si comente todos los bits sobre el objeto compartido, el jar funciona bien, y puedo interactuar perfectamente con él.

Puedo usar jarlib, junto con el objeto compartido de una aplicación de Android Unity con el objeto compartido en ./lib/armeabi/libFoo.so, y lo carga todo peachy.

Estoy tratando de usar el jarlib y libFoo.so en mi aplicación de Android que no es unidad, y loadLibrary se niega por completo a encontrar el libFoo.so. He intentado colocarlo para que esté incluido en mi apk en ./lib, así como en ./lib/armeabi, y nada parece hacer que la llamada de carga lo vea.

He intentado incluyendo el libFoo.so en ./lib o ./lib/armeabi del jarlib, pero una vez que trato de instalar/ejecutar mi aplicación para Android, me han dicho:

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

con esto, si está en el ./lib (no ./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. 

no estoy seguro de qué combinación me falta, pero estoy seguro de que se puede hacer, sólo parece que no puede entender cómo hacerlo!

Respuesta

6

¡Bien! Resultó ser algo tan pequeño que me causó ocho horas de dolores de cabeza.

Encontré que mi libFoo.so no aparecía en mi app.apk/lib/armeabi/libFoo.so como lo hizo cuando unity construyó los apk. Supuse que tenía algo que ver con eso, así que comencé a buscar configuraciones para asegurarme de que mi carpeta lib se copiara en la apk.

Como resultado, la carpeta de la liberación no es, sin embargo ...

¿Recuerdas que dije que trató en (en el lado de la aplicación androide):

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

Resulta que lo Necesitaba ponerlo en un camino similar. Oh tan similar.

./libs/armeabi/libFoo.so 

Sí. libs. Con un s.

De hecho, cuando renombré mi carpeta 'lib' a 'libs', cambió el icono de la carpeta en eclipse para tener el pequeño símbolo de Android en ella, como las carpetas bin o res. Y por supuesto, cuando construyes el apk, la carpeta lib/armeabi está ahí (fíjate que se llama 'lib' en el apk, y no en 'libs'. Esto todavía me confunde.)

Uno de mis compañeros de trabajo (eso estaba trabajando en este proyecto antes que yo) me dijo que en algún lugar a lo largo de la línea, la carpeta solía ser 'lib', pero luego se cambió a 'libs' en una versión posterior del SDK de Android. De cualquier manera, después de haber recogido este proyecto, no me di cuenta de que la carpeta debería haber sido llamada 'lib', ya que me pareció bien. Estaba a punto de sacarme el pelo. Dejo esto aquí con la esperanza de que ALGUIEN tenga el mismo problema que yo y logre resolverlo un poco más rápido.

Cuestiones relacionadas