Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Xamarin.AndroidでJavaバインディング云々

2,479 views

Published on

第2回 Japan Xamarin User Group Conference 西日本編で発表した、Xamarin.AndroidでのJavaバインディングについての導入です。

Published in: Software
  • Be the first to comment

Xamarin.AndroidでJavaバインディング云々

  1. 1. (c) 2014 ignote Co., Ltd. Xamarin.Androidで Javaバインディングをゴニョゴニョして Parse.comのプッシュ通知を実装してみた 2014.11.8 JXUG Conference 西日本
  2. 2. (c) 2014 ignote Co., Ltd. 自己紹介 中西 孝之 (株)ignote 代表取締役 むげんメモmelocy
  3. 3. (c) 2014 ignote Co., Ltd. むげんメモ ほぼ無限大のキャンバスに いくらでも思いのままにメモができる 手描きメモアプリ https://www.youtube.com/watch?v=wZ2aYvRPhv8
  4. 4. (c) 2014 ignote Co., Ltd. むげんメモ ほぼ無限大のキャンバスに いくらでも思いのままにメモができる 手描きメモアプリ https://www.youtube.com/watch?v=wZ2aYvRPhv8
  5. 5. 仲間やファンを見つけだし、つながっていけるサービスです。 (c) 2014 ignote Co., Ltd. melocy 楽器を弾いたり、歌ったり。 これらをアプリで重ね録りして投稿することで、 主な機能 ・録音&投稿 ・投稿曲にコメントする ・投稿やメンバー探しのリクエスト ・ユーザーどうしのフォロー ・お気に入り曲の登録、連続再生
  6. 6. (c) 2014 ignote Co., Ltd. melocy.iOS Xcodeで開発 主にリアルタイム録音でのパフォーマン ス確保のため 当初はMonoTouchでプロト開発をして いた
  7. 7. (c) 2014 ignote Co., Ltd. melocy.Android Xamarin.Androidで開発 現在、プロトタイプを鋭意開発中 オーディオ制御にネイティブ(C++)開発 を併用 既存ライブラリなどのバインディングを 試作など...
  8. 8. ネイティブ (c) 2014 ignote Co., Ltd. melocy.xamarin ... Mono Xamarin.Android 各種ライブラリ Android VM サウンドなど
  9. 9. 各種ライブラリネイティブ (c) 2014 ignote Co., Ltd. Javaバインディング Mono Xamarin.Android Android VM サウンドなど
  10. 10. (c) 2014 ignote Co., Ltd. Parse.com
  11. 11. (c) 2014 ignote Co., Ltd. Parse.com MBaaS ・プッシュ通知 ・ユーザーアカウント/ログイン管理 ・データストア ・アクセス解析  などなど...
  12. 12. (c) 2014 ignote Co., Ltd. Parse.com
  13. 13. (c) 2014 ignote Co., Ltd. Parse.com
  14. 14. (c) 2014 ignote Co., Ltd. Parse.com ただし、プッシュ通知はサポートしていない
  15. 15. そこで、Javaバインディング ネイティブ (c) 2014 ignote Co., Ltd. Mono Xamarin.Android Parse.com Android VM サウンドなど
  16. 16. そこで、Javaバインディング ネイティブ (c) 2014 ignote Co., Ltd. Android Java Binding Library というライブラリプロジェクトで実現 Mono Xamarin.Android Parse.com Android VM サウンドなど
  17. 17. (c) 2014 ignote Co., Ltd. ヤってみよう!
  18. 18. (c) 2014 ignote Co., Ltd. ヤってみよう! 1.プロジェクトを作成 2.jarファイルをプロジェクトに追加 3.ビルド 4.エラー 5.Metadata.xmlを編集して、エラーを潰す 6.エラーがなくなるまで、4~5を繰り返す
  19. 19. (c) 2014 ignote Co., Ltd. 1.プロジェクトを作成
  20. 20. (c) 2014 ignote Co., Ltd. 2.jarファイルを追加
  21. 21. (c) 2014 ignote Co., Ltd. 2.jarファイルを追加
  22. 22. (c) 2014 ignote Co., Ltd. 3.ビルド
  23. 23. (c) 2014 ignote Co., Ltd. 4.エラー
  24. 24. (c) 2014 ignote Co., Ltd. 4.エラー
  25. 25. (c) 2014 ignote Co., Ltd. エラーその1 The type or namespace name `ParseCallback' does not exist in the namespace `Com.Parse'. Are you missing an assembly reference?
  26. 26. (c) 2014 ignote Co., Ltd. 対策方法 ダブルクリックして、該当ソースを表示
  27. 27. (c) 2014 ignote Co., Ltd. 対策方法 公式ドキュメントなどなどを頼りに...
  28. 28. (c) 2014 ignote Co., Ltd. 対策方法 JavaDocと照らし合わせて...
  29. 29. (c) 2014 ignote Co., Ltd. 対策方法 エラーメッセージ他でggr
  30. 30. (c) 2014 ignote Co., Ltd. 対策その1 <attr path="/api/package[@name='com.parse']/class[@name='ParseCallback']" name="visibility">public</attr>
  31. 31. (c) 2014 ignote Co., Ltd. 結果その1 エラー 76件→14件
  32. 32. 同様に、com.parse.codec.net.RFC1522Codec をpublicに。 (c) 2014 ignote Co., Ltd. 結果その1 エラー 14件→2件
  33. 33. (c) 2014 ignote Co., Ltd. エラーその2 `Com.Parse.Codec.Binary.Base32.IsInAlphabe t(sbyte)': cannot change access modifiers when overriding `protected' inherited member `Com.Parse.Codec.Binary.BaseNCodec.IsInAlp habet(sbyte)'
  34. 34. (c) 2014 ignote Co., Ltd. 対策その2 <attr path="/api/package[@name='com.parse.codec.binary']/ class[@name='Base32']/method[@name='isInAlphabet']" name="visibility">protected</attr>
  35. 35. (c) 2014 ignote Co., Ltd. 結果その2 エラー 2件→1件
  36. 36. (c) 2014 ignote Co., Ltd. エラーその3 `Com.Parse.ParseACL.UserResolutionListener .Done(Com.Parse.ParseObject, Com.Parse.ParseException)' is marked as an override but no suitable method found to override
  37. 37. (c) 2014 ignote Co., Ltd. エラーその3(原因) public partial class UserResolutionListener : global::Com.Parse.GetCallback { public abstract partial class GetCallback : global::Com.Parse.ParseCallback { public abstract void Done ( global::Java.Lang.Object p0, global::Com.Parse.ParseException p1); } public override void Done ( global::Com.Parse.ParseObject p0, global::Com.Parse.ParseException p1) }
  38. 38. (c) 2014 ignote Co., Ltd. エラーその3(原因) public partial class UserResolutionListener : global::Com.Parse.GetCallback { public abstract partial class GetCallback : global::Com.Parse.ParseCallback { public abstract void Done ( global::Java.Lang.Object p0, global::Com.Parse.ParseException p1); } public override void Done ( global::Com.Parse.ParseObject p0, global::Com.Parse.ParseException p1) } obj/Debug/generated/src/
  39. 39. (c) 2014 ignote Co., Ltd. 対策その3 <attr path="/api/package[@name='com.parse']/ class[@name='ParseACL.UserResolutionListener']/ method[@name='done']/parameter[@name='p0']" name="type">java.lang.Object</attr>
  40. 40. (c) 2014 ignote Co., Ltd. 結果その3 エラー 1件→8件
  41. 41. (c) 2014 ignote Co., Ltd. 結果その3 エラー 1件→8件増えた!
  42. 42. (c) 2014 ignote Co., Ltd. エラーその4 `Com.Parse.Signpost.Basic.HttpURLConnectionRequestAdapter' does not implement interface member `Com.Parse.Signpost.Http.IHttpRequest.Unwrap()' and the best implementing candidate `Com.Parse.Signpost.Basic.HttpURLConnectionRequestAdapter.Unwr ap()' return type `Java.Net.HttpURLConnection' does not match interface member return type `Java.Lang.Object'
  43. 43. (c) 2014 ignote Co., Ltd. エラーその4 難易度たけぇ...
  44. 44. (c) 2014 ignote Co., Ltd. 対策その4 <remove-node path="/api/package[@name='com.parse.signpost.http']/ class[@name='HttpParameters']" />
  45. 45. (c) 2014 ignote Co., Ltd. 結果その4 エラー 8件→7件
  46. 46. (c) 2014 ignote Co., Ltd. 結果その4 同様にcom.parse.signpost.http.HttpParameters を除外。
  47. 47. (c) 2014 ignote Co., Ltd. 結果その4 同様にcom.parse.signpost.http.HttpParameters を除外。 オメデトウゴザイマス!
  48. 48. (c) 2014 ignote Co., Ltd. まとめ 既存のjarは、Javaバインディングライブラリで 再利用できる! ビルドエラーとの格闘は必須! Metadata.xmlを編集して、 バインディングルールを細かく制御する! さしあたり利用しない型などなら、 いっそremoveする!
  49. 49. ありがとうございました。 (c) 2014 ignote Co., Ltd.
  50. 50. ありがとうございました。 (c) 2014 ignote Co., Ltd. WE

×