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 に
なぜビルドエラーが多発するのかというと、ひとえにJavaとC#の設計の違いにある。継承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が出来た。