2012-05-03 13 views
32

Ich möchte die JAR-Bibliothek von ActionBarSherlock in meinem Mono für Android-Projekt binden. Ich verehre mich zu dieser Dokumentation: http://docs.xamarin.com/android/tutorials/Binding_a_Java_Library_(.jar)jar-Bindung von ActionBarSherlock für Mono für Android

Ich habe erfolgreich android-support-v4.jar gebunden, die von ActionBarSherlock benötigt wird. Aber wenn ich versuche actionbarsherlock.jar zu kompilieren, es gibt mir die folgende Fehlermeldung:

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 

für die Android-support-v4.jar ich diese XML-Dateien gefunden und steckt sie in dem Wandelt Verzeichnis:

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

Angepaßt wegen Ihres tollen Benutzernamens auf dem Computer "assrock"! – Cheesebaron

+0

Nur um etwas auszuschließen, würde ich Ihre Android-SDK aus '/ Programme /' und in ein Verzeichnis ohne Leerzeichen 'c:/android-sdk' – Blundell

+0

Ich glaube, ich habe erfolgreich ActionBarSherlock in Mono für Android gebunden. Weitere Informationen und einen Download-Link mit Quellcode finden Sie in meinem Blogpost: http://www.craigsprogramming.com/2012/07/actionbarsherlock-with-mono-for-android.html – craigrs84

Antwort

5

ActionBarSherlock enthält UI-Elemente, Stile und andere Dinge, die nicht in eine JAR-Datei kompiliert werden können. Es gibt eine Notiz darüber auf der ActionBarSherlock FAQ.

F: Warum ist ActionBarSherlock ein Bibliotheksprojekt, während die ursprüngliche Kompatibilitätsbibliothek nur ein .jar ist?

A: Die Implementierung der benutzerdefinierten Aktionsleiste in ActionBarSherlock basiert auf Stilen, Designs, Layouts und Zeichenvorlagen, um ordnungsgemäß angezeigt zu werden. Aufgrund der Einschränkungen von Android- und .jar-Dateien kann dies derzeit auf keine andere Weise erreicht werden.

Edit: Es gibt einige zusätzliche Informationen zu versuchen, Ressourcen über Bibliotheksprojekte in Mono für Android unter diesem Link zu teilen: http://mono-for-android.1047100.n5.nabble.com/Resources-from-a-Library-Project-td4657828.html. Kurze Antwort ist, dass es momentan nicht möglich ist.

1

Dies wie ein Vorschlaghammer Ansatz erscheinen, aber Ihr Problem wahrscheinlich lösen ...

würde ich vorschlagen, mit Maven bauen, die viel besser, diese Abhängigkeiten behandelt. Sie können das ActionBarSherlock-Projekt in Ihrem POM referenzieren, und MVN verwaltet die Abhängigkeiten für Sie.

Ich kann die ursprüngliche Antwort auch als richtig bestätigen - es gibt eine Einschränkung für die Aufnahme von JAR-Dateien, die Layout-Ressourcen enthalten.

3

Ich glaube, ich habe ActionBarSherlock in Mono für Android erfolgreich gebunden.

Sie müssen die Java-Dateien als JAR-Datei aber ohne die Ressourcen und ohne die R-Java-Klassen-Dateien packen. Bevor Sie die Dateien packen, stellen Sie sicher, dass Sie das Kontrollkästchen in den Android-Einstellungen aktivieren, in dem "Is Library" steht, damit die Ressourcen-IDs nicht als Konstanten und als Inlined in den kompilierten Java-Klassen erstellt werden.

Sobald Sie dies getan haben, können Sie die neueste Version von Mono für Android verwenden, um die JAR-Datei zu binden.

Ressourcen müssen getrennt von der JAR-Datei kopiert und direkt im Android-Anwendungsprojekt platziert werden.Leider gibt es zur Zeit keine Möglichkeit, die Ressourcen in einem separaten Bibliotheksprojekt zu isolieren, wenn Mono für Android verwendet wird, aber ich erwarte, dass sich das bald ändern wird.

Schließlich müssen Sie Ihre C-Sharp-Projektdatei bearbeiten, sodass sie bei jeder Neuerstellung automatisch eine neue Version der Java-Klassendatei com.actionbarsherlock.R erstellt. Dies ist erforderlich, um alle Ressourcen-IDs synchron zu halten.

Ich habe vielleicht einen oder zwei Schritte verpasst, aber das sind die wichtigsten.

Sehen Sie bitte mein Blog-Post für weitere Informationen und einen Download-Link mit Quellcode:

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

Verwandte Themen