iOS
Plugin
Unity
turbojpeg

Unity(iOS) + turbo-jpegで実行時エラーが起きたのでその対処

Android/iOS共通プロジェクトで turbo-jpegを使おうとして、iOS上でハマったことをメモ。

環境

  • Unity5.6.2p1
  • iOS 10.3.3

libraryの準備

turbo-jpegの公式source forge( https://sourceforge.net/projects/libjpeg-turbo/files/ )から、Mac/iOS共有の .dmgを download。

Unityの Plugins/iOS/以下に

  • libjpeg.a
  • libturbojpeg.a

を copy。

そのまま Unity+Xcodeで Buildすると

実行中、(turbo)jpegで読み書きなどしようとすると

tjGetErrorStr:JPEG parameter struct mismatch: library thinks size is 600, caller expects 632

とかいって怒られてしまい実行できません。構造体の byte packingまわりかなと思い turbo-jpegを自前buildして色々と試してみましたが改善せず。

よくよく調べてみると、turbo-jpegと Unityかどこかが持っている jpeglibが衝突している様子。

というわけで

Link順序を変更

Xcode の Other Linker Flagsにおいて-lturbojpeg -ljpegを先頭に追記してやることで、まっさきに linkするように修正しました。

libjpegturbo.png

これで問題解決。先述のエラーも出なくなり、無事動作するようになりました。

おわりに

iOSで C/C++な pluginを書くこともレアかもしれませんが、PCや Androidと共通化すると時々ハマるタイプの罠でした。