rksoftware

Visual Studio とか C# とかが好きです

Android アプリを Xamarin.Android に移植する (4)

前々々回 Android アプリを Xamarin.Android に移植する (1) で UI を移植しました。

今回 2 つ目のクラスの移植を行って行きます。

■ 今回移植するクラス

今回は
com.example.android.common.media.MediaCodecWrapper クラス を C# で書き換えます。

■ MediaCodecWrapper クラスの作成

Mac の場合

・ソリューションエクスプローラーの太字になっているプロジェクト名で右クリック (二本指タップ) し 追加 > 新しいファイル を選択します。
・[新しいファイル]ダイアログで General > 空のクラス を選択し、[名前] に 「MediaCodecWrapper」 を入力します。
・[新規]ボタンをクリックします。

Windows の場合

・ソリューションエクスプローラーの太字になっているプロジェクト名で右クリック (二本指タップ) し 追加 > 新しい項目 を選択します。
・[新しい項目の追加]ダイアログで Visual C# > クラス を選択し、[名前] に 「MediaCodecWrapper」 を入力します。
・[新規]ボタンをクリックします。

■ MediaCodecWrapper クラスの移植

上記で作成したクラスのソースのクラス宣言は次のようになっているはずです。

public class MediaCodecWrapper
{
    public MediaCodecWrapper()
    {
    }
}

ソースコードの コピー & ペースト

Java の MediaCodecWrapper クラスの package、import を除いた

public class MediaCodecWrapper {

...
中略
...

}

で C# の MediaCodecWrapper クラスの using、namespace を除いた

    public class MediaCodecWrapper
    {
        public MediaCodecWrapper()
        {
        }
    }

を上書きします。

using の追加

前回の CameraHelper クラスでは、1 つずつ確認しながら using を追加しました。
今回は必要な using は最初に追加してしまいます。

using System.Linq;
using Android.OS;
using Android.Media;
using System.Collections.Generic;
using Java.Nio;
using Java.Lang;
using Java.Util;
using Android.Views;

を追加します。最初からある using System; と合わせて次のようになります。

using System;
using System.Linq;
using Android.OS;
using Android.Media;
using System.Collections.Generic;
using Java.Nio;
using Java.Lang;
using Java.Util;
using Android.Views;

メソッド名の変更

Java ではメソッド名は小文字で始まりますが、C# では大文字で始まります。
小文字で始まっているメソッド名を、大文字始まりに一気に変更して行きます。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

codec.start()codec.Start()
mDecoder.stop()mDecoder.Stop()
mDecoder.release()mDecoder.Release()
codec.getInputBuffers()codec.GetInputBuffers()
codec.getOutputBuffers()codec.GetOutputBuffers()
Looper.myLooper()Looper.MyLooper()
trackFormat.getString(trackFormat.getString(
mimeType.contains(mimeType.Contains(
MediaCodec.createDecoderByType(MediaCodec.CreateDecoderByType(
videoCodec.configure(videoCodec.Configure(
input.remaining()input.Remaining()
buffer.capacity()buffer.Capacity()
buffer.clear()buffer.Clear()
buffer.put(buffer.Put(
mDecoder.queueInputBuffer(mDecoder.QueueInputBuffer(
mDecoder.queueSecureInputBuffer(mDecoder.QueueSecureInputBuffer(
extractor.readSampleData(extractor.ReadSampleData(
extractor.getSampleCryptoInfo(extractor.GetSampleCryptoInfo(
out_bufferInfo.set(out_bufferInfo.Set(
mDecoder.releaseOutputBuffer(mDecoder.ReleaseOutputBuffer(
mDecoder.dequeueInputBuffer(mDecoder.DequeueInputBuffer(
mDecoder.dequeueOutputBuffer(mDecoder.DequeueOutputBuffer(
mDecoder.getOutputBuffers()mDecoder.GetOutputBuffers()
mHandler.post(mHandler.Post(

プロパティ名の変更

Java では公開データメンバは小文字で始まりますが、C# ではプロパティになり、大文字始まりになります。
小文字で始まっているプロパティ名を、大文字始まりに一気に変更して行きます。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

mOutputBuffers.lengthmOutputBuffers.Length
mInputBuffers.lengthmInputBuffers.Length)
info.offsetinfo.Offset
info.sizeinfo.Size
info.presentationTimeUsinfo.PresentationTimeUs
info.flagsinfo.Flags
Locale.USLocale.Us

定数名の変更

Java では公開フォールドはすべて大文字・_区切りですが、C# では大文字始まり大文字区切りになります。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

MediaFormat.KEY_MIMEMediaFormat.KeyMime

列挙体への変更

Java では公開フォールドはなるべく列挙体に変更されています。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

MediaCodec.BUFFER_FLAG_END_OF_STREAM(int)MediaCodec.BufferFlagEndOfStream
, flags), (MediaCodecBufferFlags)flags)
MediaCodec.INFO_TRY_AGAIN_LATER(int)MediaCodec.InfoTryAgainLater
MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED(int)MediaCodec.InfoOutputBuffersChanged
MediaCodec.INFO_OUTPUT_FORMAT_CHANGED(int)MediaCodec.InfoOutputFormatChanged

final ローカル変数の変更

Java では変更不可のローカル変数の定義に final キーワードを使用しますが、C# では const になります。
さらに C# では文字列がリテラルでなければなりません。そのため、ここでは const が使用できません。final の指定は削除します。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

final String mimeType =string mimeType =

final 引数の変更

Java ではメソッドの引数にはなるべく final を付けますが、C# では同等の機能はありません。
引数の final を削除します。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

final → ``````

Queue への変更

Java の ArrayDeque<> クラスは Xamarin に移植されていません。代わりに C# の Queue<T> クラスを使用します。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

Queue<Integer>Queue<int>
ArrayDeque<>Queue<int>

また、クラスが変わりのでメソッドも変わります。Queue<T> の同等のメソッドを使用するよう変更します。

!mAvailableInputBuffers.isEmpty()mAvailableInputBuffers.Any()
mAvailableInputBuffers.remove()mAvailableInputBuffers.Dequeue()
!mAvailableOutputBuffers.isEmpty()mAvailableOutputBuffers.Any()
mAvailableOutputBuffers.peek()mAvailableOutputBuffers.Peek()
mAvailableOutputBuffers.remove()mAvailableOutputBuffers.Dequeue()
mAvailableInputBuffers.add(mAvailableInputBuffers.Enqueue(
mAvailableOutputBuffers.clear()mAvailableOutputBuffers.Clear()
mAvailableOutputBuffers.add(mAvailableOutputBuffers.Enqueue(

throws の削除

Java のメソッドが返す場合、返す例外の種類を throws で宣言しますが、C# では同等の機能はありません。
throws の宣言を削除します。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

throws IOException
throws MediaCodec.CryptoException, WriteException

bool への変更

Java では真偽値型は boolean キーワードですが、C# では bool になります。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

booleanbool

Java.Lang.String の使用

Xamarin にする場合、文字列は C# の string を使用するべきですが、Java の String も使用できます。
今回は Java の String のメソッドが使用されている箇所は、手数を少なく書き換えのミスを減らすために、Java から移植されたクラスを使用します。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

String.format(Java.Lang.String.Format(

プロパティへの変更

Java の getter メソッドはなるべく、プロパティに変更されています。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

mDecoder.getOutputFormat()mDecoder.OutputFormat

ラムダ式への変更

Java でのイベントリスナーの匿名クラスは、C# ではラムダ式で実装します。
ラムダ式を使用すると匿名メソッドを短い手数で記述することができます。

Java の実装

mHandler.post(new Runnable() {
    @Override
    public void run()
    {
        mOutputFormatChangedListener
        .outputFormatChanged(MediaCodecWrapper.this,
            mDecoder.getOutputFormat());

    }
});

C# での実装

mHandler.Post(new Runnable(() =>
{
    mOutputFormatChangedListener
    .outputFormatChanged(this,
        mDecoder.OutputFormat);

}));

クラス継承のキーワードの変更

Java ではクラスの継承は extends キーワードですが、C# では : になります。

置換は Mac の場合は option+command+F、Windows の場合は ctrl+H で行えます。

extends:

コンストラクタの変更

Java ではコンストラクタ内でスーパークラスのコンストラクタを呼ぶキーワードは super ですが、C# では base になります。
また、記述する場所を変更になります。

Java の実装

private WriteException(String detailMessage)
{
    super(detailMessage);
}

C# での実装

public WriteException(string detailMessage) : base(detailMessage)
{
}

# ■ MediaCodecWrapper クラスの完成 これで MediaCodecWrapper クラスは完成です。
ビルドを行いエラーが出ないことを確認してください。(警告は大量に出ますが、今回はそのままにします)
エラーが出た場合は、エラーの内容と上記の書き換えを見比べて頑張ってエラーに対処してください。

■ 次回予定

ここまでで二つ目のクラスの移植は完了しました。
次回で最後のクラスである Activity の移植を行って行きます。