Cómo mantener un archivo jar externo, pero todavía uso de sus clases en mi proyecto de Android?

Necesito tener un archivo jar ubicado en un directorio main / assets dentro de un proyecto de Android. Es importante que el archivo jar se encuentre allí.

¿Con mi proyecto principal de Android hay una manera de hacer referencia a este archivo jar en mi código y usar sus clases?

Para ser claro, no quiero añadir el tarro al proyecto principal una vez compilado.

EDIT : He intentado el enlace de abajo y parece que cargar el archivo de clase que he indicado. Pero estoy esforzándome por definir argumentos de constructor para la clase cargada dinámicamente.

Android-custom-class-loading-sample

EDIT2

Cerca de allí. He confirmado que la clase se carga desde mi classes.jar. Sin embargo, estoy atrapado instánciándolo.

En la línea de licenseValidatorClazz.getConstructor consigo el error abajo. Supongo que me falta algo de mi archivo de interfaz?

Java.lang.NoSuchMethodException: [interface com.google.android.vending.licensing.Policy, interfaz com.google.android.vending.licensing.DeviceLimiter, interfaz com.google.android.vending.licensing.LicenseCheckerCallback, int, class java .lang.String, clase java.lang.String]

public Class licenseValidatorClazz = null; public LicenseValidator validator; ... // Initialize the class loader with the secondary dex file. DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(), optimizedDexOutputPath.getAbsolutePath(), null, mContext.getClassLoader()); try { // Load the library class from the class loader. licenseValidatorClazz = cl.loadClass("com.google.android.vending.licensing.LicenseValidator"); validator = (LicenseValidator) licenseValidatorClazz.getConstructor(Policy.class,DeviceLimiter.class,LicenseCheckerCallback.class,int.class,String.class,String.class).newInstance(ddd, new NullDeviceLimiter(), callback, generateNonce(), mPackageName, mVersionCode); } catch (Exception exception) { // Handle exception gracefully here. exception.printStackTrace(); } 

Tengo una interfaz que contiene las funciones para pasar a la clase cargada.

 public interface LicenseValidator { public LicenseCheckerCallback getCallback(); public int getNonce(); public String getPackageName(); public void verify(PublicKey publicKey, int responseCode, String signedData, String signature); public void handleResponse(int response, ResponseData rawData); public void handleApplicationError(int code); public void handleInvalidResponse(); } 

Para utilizar un tarro externo para asociarlo con su aplicación y utilizarlo durante el tiempo de ejecución, debe estar en formato dalvik ya que los tarros normales no pueden funcionar bajo dalvikVM.

  1. Convierta sus archivos utilizando la herramienta dx
  2. Usando aapt cmd, agregue esos classes.dex a su archivo jar.
  3. Ahora este tarro que contiene archivos en formato dalvik puede ser cargado en nuestro proyecto.

Aquí hay un post que explica el procedimiento para lograrlo.

Hay pasos para lograr esto.

  1. Usted tiene que hacer una copia de su archivo JAR en el almacenamiento interno privado de su aplicación.

    1. Utilizando la herramienta dx dentro de la carpeta android, debe generar un archivo classes.dex asociado al archivo JAR. La herramienta dx estará en la ubicación /android-sdks/build-tools/19.0.1 (este archivo es necesario para la VM de Dalvik, simplemente el jar no puede ser leído por la VM de dalvik))

    2. Utilizando el comando aapt tool que también está dentro de la misma ubicación, tiene que agregar classes.dex al archivo JAR.

Este archivo JAR podría cargarse dinámicamente usando DexClassLoader.

Si está creando un JAR desde cualquier biblioteca, debe realizar los pasos siguientes (1-4) cada vez que se produzca un cambio en el código fuente de la biblioteca. Por lo tanto, puede automatizar estos pasos creando un script de shell (en Mac / Linux / Ubuntu) o secuencias de comandos por lotes (en Windows). Puede consultar este enlace para entender cómo escribir scripts de shell.

Nota: Una situación para implementar este método es, cuando es imposible agregar los archivos JAR directamente a la ruta de construcción del proyecto principal y necesita ser cargado dinámicamente en tiempo de ejecución. En casos normales, los archivos JAR se podrían agregar a la ruta de construcción.

Compruebe este acoplamiento para el código detallado y la puesta en práctica.

Cómo cargar un archivo jar en tiempo de ejecución

Android: ¿Cómo cargar dinámicamente las clases desde un archivo JAR ?

¡¡Espero que esto ayude!!

Debe probar la API de servicios: java.util.ServiceLoader

Usted define una interfaz de servicio y sus implementaciones en su tarro.

  package com.my.project; public interface MyService { ... } public class MyServiceBarImpl implements MyService { ... } public class MyServiceFooImpl implements MyService { ... } 

A continuación, define los servicios contenidos en el archivo jar en el directorio META-INF / services /. Por ejemplo, en el archivo 'META-INF / services / com.my.project.MyService', se enumeran las clases de proveedor.

 # Known MyService providers. com.my.project.MyServiceBarImpl # The original implementation for handling "bar"s. com.my.project.MyServiceFooImpl # A later implementation for "foo"s. 

Entonces, en su base de código principal, puede instanciar una instancia de MyService con el ServiceLoader:

 for (MyService service : ServiceLoader.load(MyService.class)) { //Perform some test to determine which is the right MyServiceImpl //and then do something with the MyService instance } 

Estos ejemplos se toman más o menos directamente de la API, aunque he cambiado los nombres de los paquetes para hacerlos un poco menos molesto leer.

  • Sincronización de contactos con mi propia aplicación como skype o whatsapp
  • ¿Cómo puedo obtener una variable de otra clase en Java?
  • No se puede crear el convertidor para la clase com.squareup.okhttp.ResponseBody
  • GLES2.0: Usar GL_TEXTURE_EXTERNAL_OES a través de glEGLImageTargetTexture2DOES
  • ¿Cómo burlar el método de Bundle en Android Unit-Test?
  • ¿Por qué la cámara del emulador androide se detiene inesperadamente?
  • Utilizar el mismo fragmento varias veces en la misma actividad / diseño
  • Android - java - contar palabras
  • Argumento del tipo de método genérico de Java
  • Implementar seguridad a nivel de firma en los servicios de Android con más de una firma permitida
  • Android ndk: Problema para la llamada del método Java desde c ++ con jni
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.