ホームページ開発ツール>Xojo Cocoa 64bit Plugin 覚書・基礎編

 Xojo Cocoa 64bit Plugin 覚書

基礎編

目次
 はじめに

 CocoaのAPIについては、Declareを使えばあらかた出来てしまうので、Pluginの必要性は薄れていたのですが、偶々、DeclareとPluginの性能比較をしてみたいケースが出てきたので、久しぶりに手を染めてみました。(ちなみに、性能的にはほとんど変わらずで、ボツになってしまいました。(泣)
 時節柄、64bitでの作成となりましたが、32bit当時と同じところ、変わったところ、いくつかありましたので、纏めておくことにしました。


 テスト環境

 ・Mac mini 2018
 ・macOS Mojave 10.14.6
 ・Xojo 2019 Release 1.1
 ・Xcode 11.2


 基本方針

 基本的には32bit版と同じですが、違うところもあるので改めて記しておきます。
  1. プラグインの作成にはXcodeのみを使用する
     いつから変わったのかは定かではありませんが、Plugin Converterを使わずにプラグインを作成できるようになっていました。
     詳細は、以下の「パッケージ化する」で記述します。

  2. ひな形は自分で用意する
     Xcode用のテンプレートは相変わらず用意されていないようなので、今回もExamplesフォルダ内のHostedPluginExampleをベースに使いました。
    (32bit版のプロジェクトを流用する手もあるとは思いますが、環境がガラッと変わっているので、ここでは新規に作り直すことにしました。)
     具体的な作業内容は、次項の「dylibをビルドする」で記述します。

  3. Warningは対策する
     Xojo 2019 Release 1.1添付のプロジェクトをXcode 11.2で開くと、以下の様にアップデートを促すWarningが出ます。
     全てデフォルトの選択でいいと思います。


  4. 64bit専用にする
     Xcode 10以降、32bitではビルドできなくなったので、アーキテクチャは「x86_64」のみに変更します。


  5. 必要ならDeployment Targetを変更する
     デフォルトの設定(10.9になると思います)でよければ問題ありませんが、10.7にしたい場合はlstdc++がないと言われるので、対策します。

     参考サイト(1):Ticket #39116: macOS版 開発環境をXcode 9に移行 - MIDITrail - OSDN(2019-04-08 00:39のビルド設定の項)

 dylibをビルドする

 今回は、プラグイン作成ルートの再確認が目的なので、処理内容は(以前の記事と同じく)「与えられた二つの文字列を連結して返す」という、極めてシンプルなものとしました。

 まずはXcodeを用いてdylibを作成します。手順は以下の通りです。(32bit版と同じですが、改めて。)
  1. Xojo 2019 Release 1.1/Extras内のPluginsSDKフォルダを、適当な場所にコピー
  2. Examplesフォルダ内のHostedPluginExampleフォルダを複製し、適当な名前(ここでは、PluginModule1)にリネーム
  3. HostedPluginExample.xcodeprojをXcode 11.2で開く
  4. REALExampleLevelIndicator.hとREALExampleLevelIndicator.mmを削除
  5. プロジェクト名をPluginModule1にリネーム(やり方は、例えば参考サイト(2)を参照。Project NameとManage Schemes..のみ必須。)
  6. HostedPluginExample.cppをPluginModule1.cppにリネーム(ファイル名選択後、もう一度クリックして名前を変更)
  7. ここでプロジェクトを一旦閉じ、再び開く(そうしないと、名前の変更がビルドの結果に正しく反映されない場合がある。)
  8. 前項のWarning対策
  9. 必要なら、Deployment Targetを変更して対策
  10. PluginModule1.cppの中身を全文削除後に、以下をペースト
    #include "rb_plugin.h"
    
    static REALstring CatString( REALstring str1, REALstring str2 );
    
    REALmethodDefinition PluginModule1Methods[] = {
    	{ (REALproc)CatString, REALnoImplementation, "CatString(str1 as string, str2 as string) as string", REALconsoleSafe | REALScopeGlobal },
    };
    
    REALmoduleDefinition PluginModule1Definition = {
    	kCurrentREALControlVersion,
    	"PluginModule1",
    	PluginModule1Methods,
    	sizeof( PluginModule1Methods ) / sizeof( REALmethodDefinition ),
    	nil,  // PluginModule1Constants,                                      --> No Use
    	0,    // sizeof( PluginModule1Constants ) / sizeof( REALconstant ),   --> No Use
    	nil,  // PluginModule1Properties,                                     --> No Use
    	0,    // sizeof( PluginModule1Properties ) / sizeof( REALproperty ),  --> No Use
    };
    
    static REALstring CatString( REALstring str1, REALstring str2 ) {
    	NSString* nsstr1 = (NSString *)REALCopyStringCFString(str1);
    	NSString* nsstr2 = (NSString *)REALCopyStringCFString(str2);
    	
    	NSString* nsstr3 = [NSString stringWithFormat:@"%@ %@",nsstr1, nsstr2];
    	const char* cstr3 = [nsstr3 UTF8String];
    	
    	return REALBuildStringWithEncoding(cstr3, (int)::strlen(cstr3), kREALTextEncodingUTF8);
    }
    
    void PluginEntry( void ) {
    	REALRegisterModule( &PluginModule1Definition );
    }
    
    注)32bit版で使用したREALBuildStringはDeprecatedなので、REALBuildStringWithEncodingに変更した。

    追記:sizeof( PluginModule1Constants ) / sizeof( REALconstant )sizeof( PluginModule1Properties ) / sizeof( REALproperty )をnilから0に変更した。

  11. まずCleanを実行
  12. 次にBuildを実行
 DerivedData/PluginModule1/Build/Products/Debug に libPluginModule1.dylib ができていればOK。


 パッケージ化する

 以前は、dylibをpbx形式に変換する必要がありましたが、そのステップは不要になりました。
(詳細は、Plugin SDK内のPluginPackaging.rtfを参照)
  1. libPluginModule1.dylib(作成場所は前項参照)を、以下の構成をもつフォルダにコピーする。
    +- PluginModule1                       // Folder
        +- Build Resources                 // Folder
            +- Mac x86-64                  // Folder ( for Mac Intel 64bit )
                +- libPluginModule1.dylib  // dylib
    
  2. PluginModule1フォルダをzip圧縮し、拡張子をzipからxojo_pluginに変更する。(ダイアログでOKを押すと、アイコンが変わる)
  3. できたPluginModule1.xojo_pluginをXojoのpluginsフォルダに移動する。
 もう一つ、フォルダのまま使う方法もあります。デバッグ時には圧縮の手間を省くことができて便利です。
  1. 上記と同じ要領で、PluginModule1フォルダを作成
  2. Xojoのpluginsフォルダ内に新規フォルダを作成し、名前は任意、拡張子をxojo_pluginとする。
  3. PluginModule1フォルダを上記フォルダ内に移動する。
 キモは、PluginModule1フォルダを、拡張子を付与したフォルダ内に置くこと。PluginModule1フォルダに拡張子をつけてpluginsフォルダに置いても認識しません。
 なお、拡張子を付与したフォルダ内には、PluginModule1フォルダの他にも、複数のフォルダを置くことができます。
追記:拡張子を付与したフォルダ内に複数のフォルダを置くと、実行時にランタイムエラーが発生する(場合がある?)ことを確認しました。
拡張子を付与したフォルダ内には1個のフォルダ、とした方が無難なようです。
S Shot1
(クリックで拡大)

 動作テストする

 動くかどうか、テストします。
  1. Xojoを起動する。
  2. Window1にPushButtonを置き、Actionイベントに以下を記述。
    MsgBox PluginModule1.CatString("Hello","World")
    
     注)原則として「モジュール名.メソッド名」で呼び出すが、メソッド名がユニークであれば、モジュール名を省略できる。
  3. 実行する。
  4. PushuButtonを押す。ダイアログに「Hello World」と表示されればOK。

 おわりに

 今回は基礎編ということで、まずは「プラグイン作成ルートの確定」について書き留めました。
 ルートが確定すれば、内容に集中することができます。
 内容については、機会があればあらためて触れてみたいと思います。

 注)上述のサンプルはあくまで動作確認用で、配布を前提としたものではありません。(配布用とするにはいくつかの配慮が必要なようです。)


 お世話になったサイト

 貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):Ticket #39116: macOS版 開発環境をXcode 9に移行 - MIDITrail - OSDN(2019-04-08 00:39のビルド設定の項)
 参考サイト(2):Xcode4のプロジェクト名変更方法 : NAGAOKA STATION


 更新履歴

 2023.03.15 dylibをビルドする、パッケージ化する、に追記を追加。
 2019.11.08 新規作成


[Home]  [MacSoft]  [Donation]  [History]  [Privacy Policy]  [Affiliate Policy]