32 votes

jar-Binding d'ActionBarSherlock pour Mono pour Android

Je'like pour lier le pot-de la bibliothèque de ActionBarSherlock dans mon Mono Pour Android projet. Je suis reverencing à cette documentation: http://docs.xamarin.com/android/tutorials/Binding_a_Java_Library_(.jar)

J'ai lié avec succès android-support-v4.jar qui est nécessaire pour ActionBarSherlock. Mais lorsque j'essaie de compiler actionbarsherlock.jar il me donne le message d'erreur suivant:

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

Pour l'android-support-v4.jar j'ai trouvé ces fichiers xml et les mettre dans le Transforme répertoire:

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>

5voto

Christian Points 1300

ActionBarSherlock comprend des éléments de l'INTERFACE utilisateur, les styles, et d'autres choses qui ne peut pas être compilé dans un fichier JAR. Il y a une note à ce sujet sur le ActionBarSherlock FAQ.

Q: Pourquoi est-ActionBarSherlock un projet de bibliothèque alors que l'original de la bibliothèque de compatibilité n'est qu'une .pot?

Un: La barre d'action mise en œuvre au sein de ActionBarSherlock s'appuie sur les styles, les thèmes, les mises en page, et un drawable afin de s'afficher correctement. En raison de limitations d'Android et .les fichiers jar, actuellement, cela ne peut être accompli d'une autre façon.

Edit: Il y a quelques informations supplémentaires à propos de la tentative de partager des ressources à travers des projets de la bibliothèque en Mono pour Android sur ce lien: http://mono-for-android.1047100.n5.nabble.com/Resources-from-a-Library-Project-td4657828.html. Bref, la réponse est que cela ne semble pas possible pour le moment.

3voto

craigrs84 Points 397

Je crois que j'ai lié avec succès ActionBarSherlock en Mono pour Android.

Vous avez besoin pour compresser les fichiers java forme d'un fichier JAR, mais sans ressources et sans la R les fichiers de classe java. Avant de paquet les fichiers assurez-vous que vous cochez la case dans les paramètres Android qui dit "Bibliothèque" de sorte que l'Id de ressource ne sont pas créés comme des constantes et inline dans votre compilé des classes java.

Une fois que vous avez fait cela, vous pouvez utiliser la dernière version de Mono pour Android pour lier le fichier JAR.

Les ressources doivent être copiés séparément du fichier JAR et placé directement dans la principale de l'application android du projet. Malheureusement, à l'heure actuelle, il n'existe aucun moyen d'isoler les ressources dans une bibliothèque séparée de projet lors de l'utilisation de Mono pour Android, mais je pense que cela va bientôt changer.

Enfin, vous avez besoin de modifier votre C-Sharp fichier de projet pour qu'il crée automatiquement une nouvelle version de la com.actionbarsherlock.R fichier de classe java à chaque fois que vous reconstruire. Cela est nécessaire pour garder tous vos Id de ressource dans la synchronisation.

J'ai peut-être raté une étape ou deux, mais ceux qui sont les plus importants.

Veuillez consulter mon blog pour plus d'informations et un lien de téléchargement avec le code source:

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

1voto

Booger Points 7311

Cela peut sembler une approche de massue, mais cela résoudra probablement votre problème ...

Je suggérerais de construire avec Maven, qui gère ces dépendances beaucoup mieux. Vous pourrez référencer le projet ActionBarSherlock dans votre POM et MVN gérera les dépendances à votre place.

Je peux également confirmer l'exactitude de la réponse d'origine. Il existe une limite à l'inclusion de fichiers JAR contenant des ressources de présentation.

0voto

Timur Gilfanov Points 86

On dirait que Xamarin a résolu le problème lié à ActionBarSherlock

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

Ce correctif a été inclus dans 4.2.5, qui est disponible sur le canal alpha maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X