ホームページ>開発ツール>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版と同じですが、違うところもあるので改めて記しておきます。
- プラグインの作成にはXcodeのみを使用する
いつから変わったのかは定かではありませんが、Plugin Converterを使わずにプラグインを作成できるようになっていました。
詳細は、以下の「パッケージ化する」で記述します。
- ひな形は自分で用意する
Xcode用のテンプレートは相変わらず用意されていないようなので、今回もExamplesフォルダ内のHostedPluginExampleをベースに使いました。
(32bit版のプロジェクトを流用する手もあるとは思いますが、環境がガラッと変わっているので、ここでは新規に作り直すことにしました。)
具体的な作業内容は、次項の「dylibをビルドする」で記述します。
- Warningは対策する
Xojo 2019 Release 1.1添付のプロジェクトをXcode 11.2で開くと、以下の様にアップデートを促すWarningが出ます。
全てデフォルトの選択でいいと思います。
- 64bit専用にする
Xcode 10以降、32bitではビルドできなくなったので、アーキテクチャは「x86_64」のみに変更します。
- 必要ならDeployment Targetを変更する
デフォルトの設定(10.9になると思います)でよければ問題ありませんが、10.7にしたい場合はlstdc++がないと言われるので、対策します。
参考サイト(1):Ticket #39116: macOS版 開発環境をXcode 9に移行 - MIDITrail - OSDN(2019-04-08 00:39のビルド設定の項)
dylibをビルドする
今回は、プラグイン作成ルートの再確認が目的なので、処理内容は(以前の記事と同じく)「与えられた二つの文字列を連結して返す」という、極めてシンプルなものとしました。
まずはXcodeを用いてdylibを作成します。手順は以下の通りです。(32bit版と同じですが、改めて。)
DerivedData/PluginModule1/Build/Products/Debug に libPluginModule1.dylib ができていればOK。
- Xojo 2019 Release 1.1/Extras内のPluginsSDKフォルダを、適当な場所にコピー
- Examplesフォルダ内のHostedPluginExampleフォルダを複製し、適当な名前(ここでは、PluginModule1)にリネーム
- HostedPluginExample.xcodeprojをXcode 11.2で開く
- REALExampleLevelIndicator.hとREALExampleLevelIndicator.mmを削除
- プロジェクト名をPluginModule1にリネーム(やり方は、例えば参考サイト(2)を参照。Project NameとManage Schemes..のみ必須。)
- HostedPluginExample.cppをPluginModule1.cppにリネーム(ファイル名選択後、もう一度クリックして名前を変更)
- ここでプロジェクトを一旦閉じ、再び開く(そうしないと、名前の変更がビルドの結果に正しく反映されない場合がある。)
- 前項のWarning対策
- 必要なら、Deployment Targetを変更して対策
- PluginModule1.cppの中身を全文削除後に、以下をペースト
注)32bit版で使用したREALBuildStringはDeprecatedなので、REALBuildStringWithEncodingに変更した。#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 ); }
追記:sizeof( PluginModule1Constants ) / sizeof( REALconstant )とsizeof( PluginModule1Properties ) / sizeof( REALproperty )をnilから0に変更した。
- まずCleanを実行
- 次にBuildを実行
パッケージ化する
以前は、dylibをpbx形式に変換する必要がありましたが、そのステップは不要になりました。
(詳細は、Plugin SDK内のPluginPackaging.rtfを参照)
もう一つ、フォルダのまま使う方法もあります。デバッグ時には圧縮の手間を省くことができて便利です。
- libPluginModule1.dylib(作成場所は前項参照)を、以下の構成をもつフォルダにコピーする。
+- PluginModule1 // Folder +- Build Resources // Folder +- Mac x86-64 // Folder ( for Mac Intel 64bit ) +- libPluginModule1.dylib // dylib- PluginModule1フォルダをzip圧縮し、拡張子をzipからxojo_pluginに変更する。(ダイアログでOKを押すと、アイコンが変わる)
- できたPluginModule1.xojo_pluginをXojoのpluginsフォルダに移動する。
キモは、PluginModule1フォルダを、拡張子を付与したフォルダ内に置くこと。PluginModule1フォルダに拡張子をつけてpluginsフォルダに置いても認識しません。
- 上記と同じ要領で、PluginModule1フォルダを作成
- Xojoのpluginsフォルダ内に新規フォルダを作成し、名前は任意、拡張子をxojo_pluginとする。
- PluginModule1フォルダを上記フォルダ内に移動する。
なお、拡張子を付与したフォルダ内には、PluginModule1フォルダの他にも、複数のフォルダを置くことができます。
追記:拡張子を付与したフォルダ内に複数のフォルダを置くと、実行時にランタイムエラーが発生する(場合がある?)ことを確認しました。
拡張子を付与したフォルダ内には1個のフォルダ、とした方が無難なようです。
(クリックで拡大)
動作テストする
動くかどうか、テストします。
- Xojoを起動する。
- Window1にPushButtonを置き、Actionイベントに以下を記述。
注)原則として「モジュール名.メソッド名」で呼び出すが、メソッド名がユニークであれば、モジュール名を省略できる。MsgBox PluginModule1.CatString("Hello","World")
- 実行する。
- 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]