Encuadernación jar de ActionBarSherlock para Mono para Android

Me gusta vincular la biblioteca jar de ActionBarSherlock en mi proyecto Mono para Android. Estoy reverenciando a esta documentación: http://docs.xamarin.com/android/tutorials/Binding_a_Java_Library_(.jar)

He enlazado con éxito android-support-v4.jar que necesita ActionBarSherlock. Pero cuando intento compilar actionbarsherlock.jar, aparece el siguiente mensaje de error:

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 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>

Metadatos.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>

preguntado el 03 de mayo de 12 a las 20:05

¡Votado por tu increíble nombre de usuario en la computadora "assrock"! -

Solo para descartar algo, sacaría su SDK de Android de /program files/ y en un directorio sin espacios c:/android-sdk -

Creo que he enlazado con éxito ActionBarSherlock en Mono para Android. Consulte la publicación de mi blog para obtener más información y un enlace de descarga con el código fuente: craigsprogramming.com/2012/07/… -

4 Respuestas

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 el Preguntas frecuentes sobre ActionBarSherlock.

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

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

Edit: Hay información adicional sobre cómo intentar 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. La respuesta corta es que no parece posible en este momento.

Respondido el 20 de junio de 20 a las 10:06

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

Debe 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 biblioteca" para que los ID de recursos no se creen como constantes y se inserten en sus clases Java compiladas.

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

Los recursos deben copiarse por separado del archivo JAR y colocarse directamente en el proyecto principal de la aplicación de Android. Desafortunadamente, en este momento no hay forma de aislar los recursos en un proyecto de biblioteca separado cuando se usa Mono para Android, pero espero que eso cambie pronto.

Finalmente, debe editar su 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 todos sus ID de recursos sincronizados.

Puede que me haya perdido un paso o dos, pero esos son los más importantes.

Consulte la publicación de 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

respondido 04 nov., 13:15

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

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 por usted.

También puedo confirmar que la respuesta original es correcta: existe una limitación para incluir archivos JAR que contienen recursos de diseño.

Respondido el 07 de junio de 12 a las 21:06

Parece que Xamarin resolvió el problema vinculado a ActionBarSherlock

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

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

Respondido 04 ago 12, 14:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.