Enlace de un .JAR

Importante

Estamos investigando el uso de enlaces personalizados en la plataforma Xamarin. Realice esta encuesta para informar de esfuerzos de desarrollo futuros.

En este tutorial se proporcionan instrucciones paso a paso para crear una biblioteca de enlaces de Java de Xamarin.Android desde un archivo Android .JAR.

Información general

La comunidad de Android ofrece muchas bibliotecas de Java que puede usar en la aplicación. Estas bibliotecas Java se suelen empaquetar en formato .JAR (archivo Java), pero puede empaquetar un archivo .JAR en una biblioteca de enlaces de Java para que su funcionalidad esté disponible para las aplicaciones de Xamarin.Android. El propósito de la biblioteca de enlaces de Java es crear las API en el archivo .JAR disponible para el código C# a través de contenedores de código generados automáticamente.

Las herramientas de Xamarin pueden generar una biblioteca de enlaces a partir de uno o varios archivos .JAR. La biblioteca de enlaces (ensamblado .DLL) contiene lo siguiente:

  • El contenido de los archivos .JAR originales.

  • Contenedores que se puede llamar administrados (MCW), que son tipos de C# que contienen los tipos de Java correspondientes dentro de archivos .JAR.

El código MCW generado usa JNI (Java Native Interface) para reenviar las llamadas API al archivo .JAR subyacente. Puede crear bibliotecas de enlaces para cualquier archivo .JAR que se destine originalmente para usarse con Android (tenga en cuenta que las herramientas de Xamarin no admiten actualmente el enlace de bibliotecas de Java que no son de Android). También puede optar por compilar la biblioteca de enlaces sin incluir el contenido del archivo .JAR para que el ensamblado DLL tenga una dependencia en el archivo .JAR en tiempo de ejecución.

En esta guía se detallan los conceptos básicos de la creación de una biblioteca de enlaces para un único archivo .JAR. Lo ilustraremos con un ejemplo en el que no se requieren personalización ni depuración de los enlaces. La creación de enlaces mediante metadatos ofrece un ejemplo de un escenario más avanzado en el que el proceso de enlace no es totalmente automático y se requiere una cantidad de intervención manual. Para obtener información general sobre el enlace de la biblioteca de Java en general (con un ejemplo de código básico), consulte Enlace de una biblioteca de Java.

Tutorial

En el siguiente tutorial, vamos a crear una biblioteca de enlaces para Picasso, un conocido archivo .JAR de Android que proporciona la funcionalidad de carga de imágenes y almacenamiento en caché. Usaremos los pasos siguientes para enlazar picasso-2.x.x.jar para crear un nuevo ensamblado .NET que se pueda usar en un proyecto de Xamarin.Android:

  1. Cree un nuevo proyecto de biblioteca de enlaces de Java.

  2. Agregue el archivo .JAR al proyecto.

  3. Establezca la acción de compilación adecuada para el archivo .JAR.

  4. Elija una plataforma de destino que admita .JAR.

  5. Cree la biblioteca de enlaces.

Cuando hayamos creado la biblioteca de enlaces, desarrollaremos una pequeña aplicación Android que muestra nuestra capacidad para llamar a las API en la biblioteca de enlaces. En este ejemplo, queremos acceder a los métodos de picasso-2.x.x.jar:

package com.squareup.picasso

public class Picasso
{
    ...
    public static Picasso with (Context context) { ... };
    ...
    public RequestCreator load (String path) { ... };
    ...
}

Después de generar una biblioteca de enlaces para picasso-2.x.x.jar, podemos llamar a estos métodos desde C#. Por ejemplo:

using Com.Squareup.Picasso;
...
Picasso.With (this)
    .Load ("https://mydomain.myimage.jpg")
    .Into (imageView);

Creación de la biblioteca de enlaces

Antes de comenzar con los pasos siguientes, descargue picasso-2.x.x.jar.

En primer lugar, cree un nuevo proyecto de biblioteca de enlaces. En Visual Studio para Mac o Visual Studio, cree una nueva solución y seleccione la plantilla biblioteca de enlaces de Android. (Las capturas de pantallas de este tutorial usan Visual Studio, pero Visual Studio para Mac es muy similar). Asigne el nombre JarBinding a la solución:

Create JarBinding library project

La plantilla incluye una carpeta Jars donde se agregan los archivos .JAR en el proyecto de biblioteca de enlaces. Haga clic con el botón derecho en la carpeta Jars y seleccione Agregar > Elemento existente:

Add existing item

Vaya al archivo picasso-2.x.x.jar descargado anteriormente, selecciónelo y haga clic en Agregar:

Select jar file and click Add

Compruebe que el archivo picasso-2.x.x.jar se haya agregado correctamente al proyecto:

Jar added to project

Al crear un proyecto de biblioteca de enlaces de Java, debe especificar si el .JAR se debe insertar en la biblioteca de enlaces o empaquetar por separado. Para ello, especifique una de las siguientes acciones de compilación:

  • EmbeddedJar: el archivo .JAR se insertará en la biblioteca de enlaces.

  • InputJar: el archivo .JAR se mantendrá independiente de Bindings Library.

Normalmente, se usa la acción de compilación EmbeddedJar para que .JAR se empaquete automáticamente en la biblioteca de enlaces. Esta es la opción más sencilla, el código de bytes de Java del archivo .JAR se convierte en el código de bytes de Dex y se inserta (junto con los contenedores que se puede llamar administrados) en un APK. Si desea conservar el .JAR separado de la biblioteca de enlaces, puede usar la opción InputJar; sin embargo, debe asegurarse de que el archivo .JAR está disponible en el dispositivo que ejecuta la aplicación.

Establezca la acción de compilación en EmbeddedJar:

Select EmbeddedJar build action

A continuación, abra las propiedades del proyecto para configurar la plataforma de destino. Si el .JAR usa cualquier API de Android, establezca la plataforma de destino en el nivel de API que el .JAR espera. Normalmente, el desarrollador del archivo .JAR indicará qué nivel (o niveles) de API es compatible con .JAR. Para obtener más información sobre la configuración de la plataforma de destino y los niveles de la API de Android en general, consulte Descripción de los niveles de la API de Android.

Establezca el nivel de la API de destino de la biblioteca de enlaces (en este ejemplo, se usa el nivel 19 de la API):

Target API level set to API 19

Por último, cree la biblioteca de enlaces. Aunque se pueden mostrar algunos mensajes de advertencia, el proyecto Bindings Library debería compilarse correctamente y generar un archivo .DLL de salida en la siguiente ubicación: JarBinding/bin/Debug/JarBinding.dll

Uso de la biblioteca de enlaces

Para consumir este ensamblado .DLL en la aplicación de Xamarin.Android, haga lo siguiente:

  1. Agregue una referencia a la biblioteca de enlaces.

  2. Realice llamadas al .JAR mediante los contenedores que se pueden llamar administrados.

En los pasos siguientes, crearemos una aplicación mínima que use la biblioteca de enlaces para descargar y mostrar una imagen en un objeto ImageView; el código que reside en el archivo .JAR se encarga del "trabajo pesado".

En primer lugar, cree una nueva aplicación de Xamarin.Android que consuma la biblioteca de enlaces. Haga clic con el botón derecho en la solución y seleccione Agregar nuevo proyecto; dele al proyecto el nombre de BindingTest. Vamos a crear esta aplicación en la misma solución que la biblioteca de enlaces con el fin de simplificar este tutorial. Sin embargo, en su lugar, la aplicación que usa la biblioteca de enlaces puede residir en una solución diferente:

Add new BindingTest project

Haga clic con el botón derecho en el nodo Referencias del proyecto BindingTest y seleccione Agregar referencia...:

Right Add Reference

Compruebe el proyecto JarBinding creado anteriormente y haga clic en Aceptar:

Select JarBinding project

Abra el nodo Referencias del proyecto BindingTest y compruebe que la referencia JarBinding está presente:

JarBinding appears under References

Modifique el diseño de BindingTest (Main.axml) para que tenga un solo objeto ImageView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="25px"
    android:minHeight="25px">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageView" />
</LinearLayout>

Agregue la siguiente instrucción using a MainActivity.cs, ya que así se podrá acceder fácilmente a los métodos de la clase Picasso basada en Java que reside en Bindings Library:

using Com.Squareup.Picasso;

Modifique el método OnCreate para que use la clase Picasso para cargar una imagen de una dirección URL y mostrarla en el objeto ImageView:

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        ImageView imageView = FindViewById<ImageView>(Resource.Id.imageView);

        // Use the Picasso jar library to load and display this image:
        Picasso.With (this)
            .Load ("https://i.imgur.com/DvpvklR.jpg")
            .Into (imageView);
    }
}

Compile y ejecute el proyecto BindingTest. La aplicación se iniciará y, después de un breve retraso (según las condiciones de la red), debe descargar y mostrar una imagen similar a la siguiente captura de pantalla:

Screenshot of BindingTest running

Felicidades. Ha enlazado correctamente un archivo .JAR de la biblioteca Java y usarlo en la aplicación Xamarin.Android.

Resumen

En este tutorial, hemos creado una biblioteca de enlaces para un archivo .JAR de terceros, se ha agregado la biblioteca de enlaces a una aplicación de prueba mínima y se ha ejecutado la aplicación para comprobar que el código C# puede llamar al código de Java que reside en el archivo .JAR.