Jar-Binding de ActionBarSherlock para Mono para Android

Me gusta unir la librería de ActionBarSherlock en mi proyecto Mono For Android. Estoy reverendo a esta documentación: http://docs.xamarin.com/android/tutorials/Binding_a_Java_Library_(.jar)

He limitado correctamente android-support-v4.jar que es necesario para ActionBarSherlock. Pero cuando intento compilar actionbarsherlock.jar, él me da el mensaje de error siguiente:

Target ResolveLibraryProjects: Skipping target "ResolveLibraryProjects" because it has no inputs. Target _ResolveMonoAndroidSdks: MonoAndroid Tools: C:\Program Files (x86)\MSBuild\Novell\ MonoAndroid Framework: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v2.2\;C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v1.0\ Android SDK: C:\Program Files (x86)\Android\android-sdk\ Java SDK: C:\Program Files (x86)\Java\jdk1.6.0_31\ Target ExportJarToXml: SourceJars: Jars\actionbarsherlock.jar ReferenceJars: Jars\android-support-v4.jar C:\Program Files (x86)\Java\jdk1.6.0_31\bin\java.exe -jar "C:\Program Files (x86)\MSBuild\Novell\jar2xml.jar" --jar=C:\Users\assrock\Documents\JavaBind\JavaBind\Jars\actionbarsherlock.jar --ref="C:\Program Files (x86)\Android\android-sdk\platforms\android-8\android.jar" --out=C:\Users\assrock\Documents\JavaBind\JavaBind\obj\Release\api.xml --ref=C:\Users\assrock\Documents\JavaBind\JavaBind\Jars\android-support-v4.jar Couldn't load class com/actionbarsherlock/internal/ActionBarSherlockNative$ActionModeCallbackWrapper Couldn't load class com/actionbarsherlock/internal/app/ActionBarWrapper$TabWrapper Couldn't load class com/actionbarsherlock/internal/app/ActionBarWrapper Couldn't load class com/actionbarsherlock/internal/view/ActionProviderWrapper Couldn't load class com/actionbarsherlock/internal/view/menu/MenuItemWrapper$1 Exception in thread "main" java.lang.NoClassDefFoundError: com/actionbarsherlock/R at java.lang.Class.getDeclaringClass(Native Method) at jar2xml.JavaClass.getConstructorParameterOffset(JavaClass.java:149) at jar2xml.JavaClass.appendCtor(JavaClass.java:138) at jar2xml.JavaClass.appendToDocument(JavaClass.java:462) at jar2xml.JavaPackage.appendToDocument(JavaPackage.java:66) at jar2xml.Start.main(Start.java:157) Caused by: java.lang.ClassNotFoundException: com.actionbarsherlock.R at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 6 more C:\Program Files (x86)\MSBuild\Novell\Xamarin.Android.Bindings.targets(170,5): error MSB6006: "java.exe" exited with code 1. Task "JarToXml" execution -- FAILED Done building target "ExportJarToXml" in project "C:\Users\assrock\Documents\JavaBind\JavaBind\JavaBind.csproj".-- FAILED Done building project "C:\Users\assrock\Documents\JavaBind\JavaBind\JavaBind.csproj".-- FAILED Build FAILED. Warnings: C:\Program Files (x86)\MSBuild\Novell\Xamarin.Android.Bindings.targets(40,11): warning MSB4011: There is a circular reference involving the import of file "c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.Targets". This file may have been imported more than once, or you may have attempted to import the main project file. All except the first instance of this file will be ignored. Errors: C:\Users\assrock\Documents\JavaBind\JavaBind\JavaBind.csproj (Build) -> C:\Program Files (x86)\MSBuild\Novell\Xamarin.Android.Bindings.targets (ExportJarToXml target) -> C:\Program Files (x86)\MSBuild\Novell\Xamarin.Android.Bindings.targets(170,5): error MSB6006: "java.exe" exited with code 1. 1 Warning(s) 1 Error(s) Time Elapsed 00:00:00.4730270 --------------------- Fertig --------------------- Build: 1 Fehler, 0 Warnungen 

Para el android-support-v4.jar encontré estos archivos xml y los puse en el directorio Transforms:

EnumFields.xml

 <enum-field-mappings> <mapping jni-class="android/support/v4/app/FragmentActivity$FragmentTag" clr-enum-type="Android.Support.V4.App.FragmentTagType"> <field jni-name="Fragment_id" clr-name="Id" value="1" /> <field jni-name="Fragment_name" clr-name="Name" value="0" /> <field jni-name="Fragment_tag" clr-name="Tag" value="2" /> </mapping> </enum-field-mappings> 

EnumMethods.xml

 <enum-method-mappings> <mapping jni-class="android/support/v4/app/Fragment$SavedState"> <method jni-name="writeToParcel" parameter="p1" clr-enum-type="Android.OS.ParcelableWriteFlags" /> <method jni-name="writeToParcel" parameter="flags" clr-enum-type="Android.OS.ParcelableWriteFlags" /> </mapping> </enum-method-mappings> 

Metadata.xml

 <metadata> <remove-node path="/api/package[@name='android.support.v4.app']/class[@name='BackStackState']" /> <remove-node path="/api/package[@name='android.support.v4.app']/class[@name='FragmentState']" /> <remove-node path="/api/package[@name='android.support.v4.app']/class[@name='FragmentManagerState']" /> <remove-node path="/api/package[@name='android.support.v4.widget']/class[@name='CursorAdapter']/implements[@name='android.support.v4.widget.CursorFilter.CursorFilterClient']" /> <remove-node path="/api/package[@name='android.support.v4.widget']/class[@name='CursorAdapter']/field[@name='mCursorFilter']" /> <remove-node path="/api/package[@name='android.support.v4.content']/class[@name='AsyncTaskLoader.LoadTask']" /> <!-- FIXME: This method is an override of another method in the base types. The base method expects JLO, but this method returns Cursor. So we somehow have to fill the gap between them. --> <remove-node path="/api/package[@name='android.support.v4.content']/class[@name='CursorLoader']/method[@name='loadInBackground']" /> <remove-node path="/api/package[@name='android.support.v4.view.accessibility']/class[@name='AccessibilityNodeInfoCompat.AccessibilityNodeInfoIcsImpl']" /> <remove-node path="/api/package[@name='android.support.v4.widget']/class[@name='CursorAdapter.ChangeObserver']" /> <remove-node path="/api/package[@name='android.support.v4.view.accessibility']/class[@name='AccessibilityNodeInfoCompat.AccessibilityNodeInfoIcsImpl']" /> <remove-node path="/api/package[@name='android.support.v4.view.accessibility']/class[@name='AccessibilityNodeInfoCompat.AccessibilityNodeInfoStubImpl']" /> <remove-node path="/api/package[@name='android.support.v4.view']/interface[@name='ViewPager.OnAdapterChangeListener']" /> <attr path="/api/package[@name='android.support.v4.app']/class[@name='LoaderManager']/method[@name='initLoader']/parameter[@name='p2']" name="type">android.support.v4.app.LoaderManager.LoaderCallbacks</attr> <attr path="/api/package[@name='android.support.v4.app']/class[@name='LoaderManager']/method[@name='initLoader']/parameter[@name='callback']" name="type">android.support.v4.app.LoaderManager.LoaderCallbacks</attr> <attr path="/api/package[@name='android.support.v4.app']/class[@name='LoaderManager']/method[@name='initLoader']" name="return">android.support.v4.content.Loader</attr> <attr path="/api/package[@name='android.support.v4.app']/class[@name='LoaderManager']/method[@name='restartLoader']/parameter[@name='p2']" name="type">android.support.v4.app.LoaderManager.LoaderCallbacks</attr> <attr path="/api/package[@name='android.support.v4.app']/class[@name='LoaderManager']/method[@name='restartLoader']/parameter[@name='callback']" name="type">android.support.v4.app.LoaderManager.LoaderCallbacks</attr> <attr path="/api/package[@name='android.support.v4.app']/class[@name='LoaderManager']/method[@name='restartLoader']" name="return">android.support.v4.content.Loader</attr> </metadata> 

ActionBarSherlock incluye elementos de interfaz de usuario, estilos y otras cosas que no se pueden compilar en un archivo JAR. Hay una nota sobre esto en las preguntas frecuentes de ActionBarSherlock .

P: ¿Por qué ActionBarSherlock es un proyecto de biblioteca mientras que la biblioteca de compatibilidad original es sólo un archivo .jar?

R: La implementación de barra de acción personalizada dentro de ActionBarSherlock se basa en estilos, temas, diseños y dibujos para mostrar correctamente. Debido a las limitaciones de los archivos Android y .jar, esto no se puede lograr de otra manera.

Editar: hay alguna información adicional sobre cómo tratar de compartir recursos entre proyectos de biblioteca en Mono para Android en este enlace: http://mono-for-android.1047100.n5.nabble.com/Resources-from-a-Library-Project -td4657828.html . Respuesta corta es que no parece posible en este momento.

Creo que he enlazado con éxito ActionBarSherlock en Mono para Android.

Necesita empaquetar los archivos java como un archivo JAR pero sin los recursos y sin los archivos de clase R java. Antes de empaquetar los archivos asegúrese de marcar la casilla en la configuración de Android que dice "es la biblioteca" para que los identificadores de recursos no se creen como constantes e inline en sus clases de Java compiladas.

Una vez hecho esto, puede usar la última versión de Mono para Android para enlazar el archivo JAR.

Los recursos deben ser copiados por separado del archivo JAR y colocados directamente en el proyecto principal de la aplicación android. Por desgracia, en la actualidad no hay forma de aislar los recursos en un proyecto de biblioteca por separado cuando se utiliza Mono para Android, pero espero que cambie pronto.

Por último, debe editar el archivo de proyecto C-Sharp para que cree automáticamente una nueva versión del archivo de clase java com.actionbarsherlock.R cada vez que reconstruya. Esto es necesario para mantener sincronizados todos los ID de recursos.

Puedo haber perdido un paso o dos, pero esos son los más importantes.

Por favor, vea mi blog para obtener más información y un enlace de descarga con el código fuente:

http://www.craigsprogramming.com/2012/07/actionbarsherlock-with-mono-for-android.html

Esto puede parecer un enfoque de martillo, pero probablemente resolverá su problema …

Yo sugeriría construir usando Maven, que maneja estas dependencias mucho mejor. Podrá hacer referencia al proyecto ActionBarSherlock en su POM y MVN administrará las dependencias para usted.

Puedo confirmar la respuesta original como correcta también – hay una limitación para incluir archivos JAR que contienen recursos de diseño.

Parece que Xamarin resolvió el problema vinculado ActionBarSherlock

https://bugzilla.xamarin.com/show_bug.cgi?id=6186

Esta corrección ha incluido en 4.2.5 que está disponible en el canal alfa ahora.

  • ¿Incompatibilidades de la capa de servicio MonoTouch / MonoDroid?
  • ¿Cómo tratar con "$ {applicationid}" en Xamarin?
  • ¿Es posible usar un ListView sin ListActivity en Mono Android?
  • Componente inutilizable HockeyApp para Android (tienda de componentes Xamarin)
  • Java.IO.ISerializable Xamarin
  • VM con la versión 1.6.0 no tiene soporte multidex: No se puede encontrar la aplicación Mono.Android.Platform.ApiLevel_23 o Xamarin.Android.Platform
  • Fondo circular de ProgressBar: Android Xamarin
  • Android EditText La vinculación se rompe después de la actualización de MvvmCross de 4.2.3 a 4.4.0 con Linker activado
  • Xamarin forma la imagen de Android no se está comprimiendo
  • Xamarin Android ProGuard Habilitar
  • Cómo reciclar / eliminar el mapa de bits utilizado por tema
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.