Pertanyaan jar-Binding of ActionBarSherlock untuk Mono untuk Android


Saya suka mengikat jar-library ActionBarSherlock dalam proyek Mono For Android saya. Saya menghormati dokumentasi ini: http://docs.xamarin.com/android/tutorials/Binding_a_Java_Library_(.jar)

Saya telah berhasil mengikat android-support-v4.jar yang diperlukan oleh ActionBarSherlock. Tetapi ketika saya mencoba mengkompilasi actionbarsherlock.jar, itu memberi saya pesan kesalahan berikut:

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

Untuk android-support-v4.jar saya menemukan file-file xml ini dan menempatkannya di direktori 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>

32
2018-05-03 19:18


asal


Jawaban:


ActionBarSherlock termasuk elemen UI, gaya, dan hal-hal lain yang tidak dapat dikompilasi menjadi file JAR. Ada catatan tentang ini di FAQ ActionBarSherlock.

T: Mengapa ActionBarSherlock merupakan proyek perpustakaan sedangkan pustaka kompatibilitas asli hanya a .jar?

J: Implementasi bar aksi kustom dalam ActionBarSherlock bergantung pada gaya, tema, tata letak, dan gambar yang dapat digambar untuk ditampilkan dengan benar. Karena keterbatasan Android dan file .jar, ini saat ini tidak dapat diselesaikan dengan cara lain.

Edit: Ada beberapa informasi tambahan tentang mencoba berbagi sumber daya di seluruh proyek perpustakaan di Mono untuk Android di tautan ini: http://mono-for-android.1047100.n5.nabble.com/Resources-from-a-Library-Project-td4657828.html. Jawaban singkatnya adalah itu tidak terlihat mungkin saat ini.


5
2018-06-05 18:53



Saya yakin saya telah berhasil mengikat ActionBarSherlock di Mono untuk Android.

Anda perlu mengemas file java sebagai file JAR tetapi tanpa sumber daya dan tanpa file kelas R java. Sebelum Anda mengemas file, pastikan Anda mencentang kotak di pengaturan Android yang mengatakan "Apakah Perpustakaan" sehingga ID sumber daya tidak dibuat sebagai konstanta dan digarisbawahi dalam kelas java yang dikompilasi.

Setelah Anda melakukan ini, Anda dapat menggunakan versi terbaru Mono untuk Android untuk mengikat file JAR.

Sumber daya harus disalin secara terpisah dari file JAR dan ditempatkan langsung di proyek aplikasi utama android. Sayangnya, pada saat ini tidak ada cara untuk mengisolasi sumber daya dalam proyek perpustakaan terpisah ketika menggunakan Mono untuk Android, tetapi saya berharap itu akan segera berubah.

Akhirnya, Anda perlu mengedit file proyek C-Sharp Anda sehingga secara otomatis membuat versi baru dari file kelas java com.actionbarsherlock.R setiap kali Anda membangun kembali. Ini diperlukan agar semua ID sumber daya Anda disinkronkan.

Saya mungkin melewatkan satu atau dua langkah tetapi itu adalah yang paling penting.

Silakan lihat posting blog saya untuk informasi lebih lanjut dan tautan unduhan dengan kode sumber:

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


3
2017-07-13 15:40



Ini mungkin tampak seperti pendekatan palu godam, tetapi kemungkinan akan menyelesaikan masalah Anda ...

Saya akan menyarankan membangun menggunakan Maven, yang menangani dependensi ini jauh lebih baik. Anda akan dapat referensi proyek ActionBarSherlock di POM Anda, dan MVN akan mengelola dependancies untuk Anda.

Saya dapat mengonfirmasi jawaban asli sebagai benar juga - ada batasan untuk menyertakan file JAR yang berisi sumber daya tata letak.


1
2018-06-07 20:23



Sepertinya Xamarin telah menyelesaikan masalah ActionBarSherlock

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

Perbaikan ini telah termasuk dalam 4.2.5 yang tersedia di saluran alfa sekarang.


0
2017-08-04 13:33