概要
Julia (windows版)からライブラリを呼び出す方法の技術メモです。
想定するアプリケーションと実行環境
想定するアプリケーション:指定なし
実行環境:julia, windows10, (libiio.dllなど)
実行環境の準備
特にありません。
参考文献
- 本家,Calling C and Fortran Code, Julia Documentation
- inzkykさん,C と Fortran コードの呼び出し, Julia 1.5.4 ドキュメント
解説
基本
ccallで呼び出します。
ret = ccall((:関数名, "library名"),戻り値の型,引数の型のタプル,実引数)
実引数が「引数の型のタプル」に従って変換されて、ライブラリの関数が呼ばれ、戻り値が「戻り値の型」に従ってjuliaの型に変換されて戻ってきます。「引数の型のタプル」の指定のところで、最後のカンマを忘れないことに注意してください。
例 WindowsのAPIで名ボックスを表示する。
メッセージボックスを表示する
MB_YESNOCANCEL=0x3
MB_ICONINFORMATION=0x40
MB_TOPMOST=0x40000
ccall((:MessageBeep,"User32.dll"),Int32,(Int32,),0x10)
ccall((:MessageBoxA, "User32.dll"),Int32,(Int32,Cstring,Cstring,Int32,),0,"Test:MessageBox","Message",MB_YESNOCANCEL|MB_ICONINFORMATION | MB_TOPMOST)
libiioの呼び出し例
libiioを用いてデバイスを操作する例を示します。
juliaから直接コンテクストやデバイス構造体の中身を操作する必要がなければ、中身が空の構造体を定義するだけでもよい。ライブラリとのデータの受け渡しはこれらへのポインタを経由する。
libiioを呼び出す例
mutable struct iio_context
end
mutable struct iio_device
end
devUri="ip:pluto.local"
devPhyName="ad9361-phy"
#コンテクストを作成
ctx = ccall((:iio_create_context_from_uri,"libiio.dll"),Ptr{iio_context},(Cstring,),devUri)
#戻り値確認ののち
devPhy = ccall((:iio_context_find_device,"libiio.dll"),Ptr{iio_device},(Ptr{iio_context},Cstring,),ctx,devName)
#デバイスに諸々操作
...
#コンテクストを破壊
ccall((:iio_context_destroy,"libiio.dll"),Cvoid,(Ptr{iio_context},),ctx)
注意点など
ヌル終端文字列やメモリ管理などか。