コンピュータや音楽の事書いてます

Xamarin でJavaライブラリを使う際のエラー:「アクセシビリティに一貫性がありません。 '(クラス名)' のアクセシビリティは (フィールド名やメソッド名) よりも低く設定されています。 」

Xamarinとは、C#Androidアプリを開発出来るという画期的な開発環境。
で、Javaで作られたライブラリをXamarinのC#から使うには、Java Bindings Libraryという project templateを使って、ラッパーdllを作る必要がある。Java Bindings LibraryテンプレートによってC#のソースが生成される。

その際、良く発生すると思われるエラーが「アクセシビリティに一貫性がありません」というやつだが、これの解決についてはっきりと日本語で解説されているページが無いのでメモ。

ここ http://www.buildinsider.net/mobile/insidexamarin/10 に

なぜビルドエラーが多発するのかというと、ひとえにJavaC#の設計の違いにある。継承1つとっても、Javaではnon-publicなクラスからpublicなクラスを派生させられる。C#ではできない。

と、書いてあるので、エラーの出ているクラスをpublicに変更してやれば良い事が分かる。そして、ここ の"Resolving API Differences"という文章の中に、 Some classes are less accessible than their sub-classes という項目があって「アクセシビリティが低く設定されています」エラーと同じ事を言っているので、その後に書いてある方法でpublicに変更出来そうだ。Java Bindings Libraryテンプレートによって生成されてた".cs"ソース群の中から、エラーの出たクラス名を検索して、定義を良く見てみると、問題のクラスの定義のところに自動生成された、

// Metadata.xml XPath class reference: path="/api/package[@name='名前空間名']/class[@name='クラス名']"

Metadata.xmlにはこういうpathを書くんだよ、とコメントがあったので、さっきのサイトに載っていた、「じゃ、そのclassをpublic扱いにしてよ」という意味の

<attr path="/api/package[@name='名前空間名']/class[@name='クラス名']" name="visibility">public</attr>

をMetadata.xmlの中に書いたら、ビルドエラーが消え、dllが出来た。