窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

Xamarin.AndroidでJavaバインディングしてみたらちょっとツラかった話

TL;DR

remove-node使っとけ


またXamarin関係ネタ

先週の土曜日と日曜日でJPHACKSというイベントの東北予選に参加していました.

2016.jphacks.com

そこで提供されるAPIとかをぼーっと眺めていたらWebRTCの技術を使ったサービスのAndroidiOS向けのSDKがあるということを知りました.

あーそういえば前提督の窓にVNC埋め込むかWebRTC使ってリモート機能入れて,モバイル端末からでも使えるようにしたいなあとか思って勉強していたことを思い出しまして,WebRTCのサービス一回使ってみたいなあと思ったわけです.

そのサービスというのがNTTコミュニケーションズさんのSkyWayなわけで.

nttcom.github.io

まぁ最近はJavaAndroidアプリ書くことも減って,Xamarin.FormsでiOSのも作ってしまおうという流れで開発しています.そうした時既存のライブラリはどうしようという悩みが出てくるわけです.nuget探れば結構ラップされたものが出てくるのですが,今回に限っては見つからず,けど使いたい...ということになりました.

そのため今回目をつけたのがXamarin.AndroidJavaバインディングというか相互運用というか,そのあたりです.

Binding a Java Library - Xamarin

軽く読んでみると,なんだ,ほとんどこっちで書くことないし楽じゃん(歓喜)となっていたわけですが,ちょっと間違えるとツラくなるということがあったので書き残しておきます.

関係無いですけど,バインディングライブラリ作る程度にはこのサービス使ってるので企業賞ください(懇願)

以下箇条書きで適当に(表現含み,あまり正しくない表現が含まれてます,自分が見てわかる程度のメモ)

  • inner classだったり,特に識別子がないclassはvisibleが空白になり,継承とか実装したいときにリファレンスがないとか言われる
  • override 指定子がついてるのにないって怒られる
  • visible を public に変える -> 別のエラーが出たり,namespaceが汚れるけど一応継承できる
  • <attr path="/api/package[@name='hoge.fuga']/class[@name='piyo']" name="visibility">public</attr>みたいな感じ

  • 使わないAPIだったり,内部API,別の namespace(Javaのpackage) は remove-node で消し去って良い <- めっちゃ重要

    • 適宜 attr で追加
  • public だとかはどうやって調べる?

    • Debugビルドとかした時の,obj/Debug/api.xml を見る <- めっちゃ便利
  • Hoge.Fuga.Piyo.Value class の Value パラメータはだめ(コンストラクタと同じ名前だから?)

    • attr name で変更する
  • partial class になっているから自分で書き加えて良い

  • ヘルパーとなるメソッドとか生やした方が使い易い

  • 先人に学べ <- これで今回成功した

先人に学べというのは

[JXUG#4] 2015-04-11 Binding Java Library // Speaker Deck

こういうものを見ることです,だいたい対策が載ってました.

追記)
id:ytabuchi さんからこんな参考スライド情報もいただきました.実際に試してツラさの溢れる内容でこれも面白いです.

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

追記終わり

これを見る前はビルド時200個エラーが出て数時間かけてそのエラーを潰したらその後に200個以上のエラーが出てきて本当にこの業界から消え去りたいと思ったレベルでした.何度も言うけど

めんどくさいなら remove-node で消してみろ

ですね.

今回作ってみたラッパーライブラリはこちら

GitHub - yamachu/SkyWay-Android-SDK-forXamarin.Android

ほんと,情報量0の記事だこれ.

今年の夏は充実していたなと感じた秋の夜

夏休みにあったことを最後にまとめておこうとか思っていたらすっかり忘れていて,今はもう10月末...

そういえば数ヶ月間は何をしていたんだっけなぁと考え始めたら書いていないことが見つかったので軽く,さらっと...

8月の出来事

みたいなこととか

9月の出来事

みたいな感じのことが1週間おきぐらいにばんばん来てた気がします.学生のうちしかこんなにいろんなイベントだったり企業さんと関わること出来なそうな感じがするので,非常に充実していました. ここには書いていないけれども,この期間中ちょこちょこと学祭アプリの開発を進めたり,研究活動も進めてました.

もう遊んでられない時期になりましたからね,頑張っていきましょう.

そうえいばC90であおばやまどっとねっとの「アオバヤマノススメ vol.1」に寄稿したXamarinとGoを使ったクロスプラットフォームライブラリ作りの記事またそれに関係するものを世に出したいなーと思ってるんですけど, これ需要あるのかって感じで悩みどころであります.

Xamarinの時点でクロスプラットフォームでしょ何言ってるのこの人って感じはありますが,違うんです,PC,スマホ両方の対応という意味でのクロスプラットフォームなんです... C# あるし.NET Core使えばいいじゃん的あれもありますけど,まぁ,はい.

cgo使って作ったライブラリだから他の言語からも呼びやすいし,もちろんXamarinからでも呼べるよっていうことを言いたかった記事でした.気が向いたら公開します.