Objective Sharpieの使い方

XamarinでiOSのNativeのライブラリを使用する場合、 ライブラリをC#で呼び出すために、C#定義ファイルを作成する必要があります。

Objective Sharpieは、その定義ファイルを自動で作成するためのコマンドラインツールです。
(初期にはGUIツールとしても存在していましたが。)

使い方をまとめました。

Objective Sharpie をインストールする

こちらのページ内のリンクからインストールしてください。

現在のバージョンは2.1.6です。
バージョンが上がっている場合、下記コマンドでアップデートもできるようです。

sharpie update

iOS SDK を確認する

Objective Sharpie の実行時にターゲットSDKを指定する必要があります。
ターミナルで下記コマンドを実行し、使用できるターゲットSDKを確認しておきましょう。

sharpie xcode -sdks  

このような結果が得られます。

sdk: iphoneos9.0 arch: arm64 armv7
sdk: iphoneos8.4 arch: arm64 armv7
sdk: macosx10.11 arch: x86_64 i386
sdk: macosx10.10 arch: x86_64 i386
sdk: macosx10.9 arch: x86_64 i386
sdk: watchos2.0 arch:
sdk: watchsimulator2.0 arch:

ヘッダーファイルを用意する

Objective Sharpieはヘッダーファイルから、C#用の定義ファイルを生成します。 ここでは、わかりやすいように1つのヘッダーファイルのみ扱いました。
複数のヘッダーファイルがある場合は、1つのフォルダにまとめて入れておきます。

f:id:mattsuDev:20150925192910p:plain

C#定義ファイルを生成する

下記コマンドを環境に合わせて変更し、実行してください。 相対パスで指定してあるので、コマンドを実行するディレクトリまでは先に移動しておいてください。

sharpie bind --output=[出力先のディレクトリ] --namespace=[定義する名前空間] --sdk=[確認しておいたiOS SDKのバージョン] [ヘッダーファイルをおいてあるディレクトリ]/*.h

今回は下記のようなコマンドを実行しました。

実行ディレクトリへ移動
cd Sharpie

定義ファイルの生成
sharpie bind --output=Output --namespace=Repro --sdk=iphoneos8.4 Headers/*.h

成功すると、出力先のディレクトリに2つのファイルが生成されます。

f:id:mattsuDev:20150925192927p:plain

  • ApiDefinitions.cs
    C#での呼び出しが定義されます
  • StructsAndEnums.cs
    構造体やEnumが定義されます。

定義ファイルを修正する

出力された定義ファイルを必要に応じて修正します。
(修正なしでそのまま使用できることは少ないです。)
今回は2つのパラメータを変更しました。

Verify

この属性が付いているものは、変換内容が間違っていないか確認が必要です。
特に問題がなければ削除するだけで完了です。

[Verify (ConstantsInterfaceAssociation)]
partial interface Constants
{
    // extern double ReproVersionNumber;
    [Field ("ReproVersionNumber")]
    double ReproVersionNumber { get; }

    // extern const unsigned char [] ReproVersionString;
    [Field ("ReproVersionString")]
    byte[] ReproVersionString { get; }
}
partial interface Constants
{
    // extern double ReproVersionNumber;
    [Field ("ReproVersionNumber")]
    double ReproVersionNumber { get; }

    // extern const unsigned char [] ReproVersionString;
    [Field ("ReproVersionString")]
    byte[] ReproVersionString { get; }
}

delegate

引数に「@delegate」と書かれているとエラーになります。
単に「delegate」という名前が悪いだけなので、適当な名前に変更すれば完了です。

[Static]
[Export ("startWebViewTracking:")]
void StartWebViewTracking (NSObject @delegate);
[Static]
[Export ("startWebViewTracking:")]
void StartWebViewTracking (NSObject @id);

C#定義ファイルを使用する

以上で、C#定義ファイルの生成は完了です。
生成したファイルを使用して、XamarinでNativeライブラリを使用してみました。
こちらをご覧ください。

mattsudev.hatenablog.com

参照

qiita.com

Binding Objective-C - Xamarin

Objective Sharpie - Xamarin