2012-05-03 26 views
32

Me gusta enlazar 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)jar-Binding de ActionBarSherlock para Mono para Android

He enlazado con éxito android-support-v4.jar que necesita ActionBarSherlock. Pero cuando intento compilar actionbarsherlock.jar, me da 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 el androide-support-v4.jar He encontrado estos archivos XML y los puso en el directorio Transformaciones:

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

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

+0

Solo para descartar algo, movería su android-sdk fuera de '/ program files /' y dentro de un directorio sin espacios 'c:/android-sdk' – Blundell

+0

Creo que he vinculado exitosamente ActionBarSherlock en Mono para Android. Por favor, 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 – craigrs84

Respuesta

5

ActionBarSherlock incluye elementos de IU, estilos y otros elementos que no se pueden compilar en un archivo JAR. Hay una nota sobre esto en el ActionBarSherlock FAQ.

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

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

Editar: Hay alguna información adicional acerca de tratar de compartir recursos a través de proyectos de bibliotecas de 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.

1

Esto puede parecer un enfoque martillo, pero probablemente va a resolver su problema ...

Yo sugeriría edificio utilizando Maven, que se encarga de estas dependencias mucho mejores. Podrá hacer referencia al proyecto ActionBarSherlock en su POM, y MVN administrará las dependencias por usted.

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

3

Creo que he vinculado 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 la 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 incluyan en las clases compiladas de Java.

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

Cuestiones relacionadas