2010-01-13 20 views
6

Necesito crear una biblioteca de Android que pueda incluir como jar en cualquier aplicación de Android. Uso NetBeans 6.8, el complemento nbandroid y el SDK de Android.¿Cómo puedo usar un contenedor externo en un proyecto de Android en NetBeans?

Los pasos que di hasta el momento son:

1) Crear el proyecto de la biblioteca, con android.jar incluido para tener acceso a las clases de Android (la biblioteca utiliza android.util.Log y otras clases de Android).

2) Compile la biblioteca como un contenedor.

3) Agregue el archivo jar de la biblioteca a la aplicación Android (haga clic con el botón derecho en Bibliotecas debajo del nodo del proyecto y agregue el contenedor).

4) Agregue < uses-library > al manifiesto de Android. (erróneo e innecesario)

El paso 3 al menos me permite hacer referencia a las clases de la biblioteca en el código fuente de la aplicación, pero las clases no parecen estar realmente incluidas en tiempo de compilación. Cuando ejecuto la aplicación, obtengo el siguiente error en el registro.

I/dalvikvm( 349): Could not find method mylibrarypackage.MyClass.myMethod, referenced from method myapplicationpackage.HomeActivity.onCreate 
W/dalvikvm( 349): VFY: unable to resolve static method 985: Lmylibrarypackage/MyClass;.myMethod()V 
D/dalvikvm( 349): VFY: replacing opcode 0x71 at 0x000a 
D/dalvikvm( 349): Making a copy of Lmyapplicationpackage/HomeActivity;.onCreate code (160 bytes) 
D/AndroidRuntime( 349): Shutting down VM 
W/dalvikvm( 349): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
E/AndroidRuntime( 349): Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime( 349): java.lang.NoClassDefFoundError: mylibrarypackage.MyClass 
E/AndroidRuntime( 349): at myapplicationpackage.HomeActivity.onCreate(HomeActivity.java:58) 
E/AndroidRuntime( 349): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
E/AndroidRuntime( 349): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) 
E/AndroidRuntime( 349): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470) 
E/AndroidRuntime( 349): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
E/AndroidRuntime( 349): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
E/AndroidRuntime( 349): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 349): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 349): at android.app.ActivityThread.main(ActivityThread.java:4310) 
E/AndroidRuntime( 349): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 349): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime( 349): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
E/AndroidRuntime( 349): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
E/AndroidRuntime( 349): at dalvik.system.NativeStart.main(Native Method) 

¿Debo agregar la biblioteca a la ruta de compilación en otro lugar? ¿Me estoy perdiendo de algo?

Respuesta

6

Parece que he resuelto el problema.

No sé si perdí un paso al leer acerca de cómo usar el complemento nbandroid, pero el build-impl.xml generado no parece incluir ninguna biblioteca que agregue con NetBeans al crear el APK.

Esta es la pieza incriminación del script Ant:

<target depends="init,compile,-pre-pre-jar,-pre-jar" name="-dex"> 
    <exec executable="${dx}" failonerror="true"> 
     <arg value="--dex"/> 
     <arg value="--output=${basedir}/${intermediate.dex}"/> 
     <arg value="--positions=lines"/> 
     <arg path="${build.classes.dir}"/> 
    </exec> 
</target> 

La biblioteca está incluido y el error mencionado en la pregunta desaparece si añado este último argumento:

<arg path="${external.libs.dir}"/> 

Con external.libs.dir señalando el directorio que contiene el jar de la biblioteca.

Gracias a Christopher por hacerme ver la construcción.xml generado por las herramientas de línea de comandos de Android (el script generado al crear un proyecto de Android en NetBeans con el complemento nbandroid es bastante diferente).


Adición: Desde que estoy hablando NetBeans, otra forma de hacer esto es reemplazando el objetivo -pre-jar en build.xml del proyecto, en lugar del cambio anterior a la acumulación impl.xml. Esto se hace añadiendo lo siguiente a build.xml:

<target name="-pre-jar"> 
    <copy todir="${build.classes.dir}"> 
    <fileset dir="${external.libs.dir}" /> 
    </copy> 
</target> 

De esta manera, el vaso de la biblioteca está presente junto con las clases incorporadas, y se incluye de forma automática.

0

Incluyendo android.jar dentro de su biblioteca parece incorrecto — puede compilar en contra de él pero no debe agruparlo en su JAR.
Cuando las personas usan su biblioteca en sus aplicaciones de Android, se compilará con la versión de marco que hayan elegido.

De todos modos, en Eclipse todo lo que necesita hacer es con una biblioteca JAR es agregarlo a la ruta de compilación. No veo por qué NetBeans sería diferente. ¡Mientras construyes contra eso, parece lógico que esté en la ruta de compilación! :)

+0

No veo por qué sería diferente tampoco, pero el error en el registro parece indicar lo contrario, a menos que haya algo más que me falta. –

+0

¡Entonces culpo al plugin NetBeans! ;) ¿Funciona si lo compila desde la línea de comando usando hormiga? Creo que, de forma predeterminada, el script de Android ant hace referencia a un directorio 'libs' para JAR incluidos. –

0
<uses-library android:name="com.mylibrarypackage" /> 

no deben incluirse en el manifiesto, su uso es para incluir bibliotecas compartidas nativas de la aplicación está enlazado con mapas (es decir .:) no frascos que está utilizando en su proyecto.

Los otros pasos que menciona son correctos y funcionan en Eclipse y deberían funcionar en Netbeans a menos que haya un problema con el complemento.

+0

Dónde ubicar la biblioteca externa, si usamos la etiqueta "uses-library" en el manifiesto. El "android: nombre" debería ser el nombre del archivo o el nombre del paquete? – Fakebear

Cuestiones relacionadas