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するように修正しました。
これで問題解決。先述のエラーも出なくなり、無事動作するようになりました。
おわりに
iOSで C/C++な pluginを書くこともレアかもしれませんが、PCや Androidと共通化すると時々ハマるタイプの罠でした。