Armadilloフォーラム

Tiny Bluetooth LE Libraryのビルドについて

intec_atird

2016年5月26日 19時44分

石田です。

お世話になります。

Intelから公開されている、JavaからJNI経由でBLE通信する
TinyBのコードの内、C/C++ソースのARMクロスコンパイルに
ついて質問します。TinyBは、

https://github.com/intel-iot-devkit/tinyb/

BluezとD-BUSで通信する方式で、dbus-daemonとbluetoothdを
使用します。

C++11対応のコンパイラが必要とのことで、C++のコードは
コンパイルできたのですが、gdbus-codegenが自動生成した
以下のCのソース

generated-code.c

のコンパイルで以下の通りエラーになりました。なお、コンパイル時は、
TinyBに含まれる必要なヘッダーファイルを一箇所に集めて手動で
実行しています。

---
arm-linux-gnueabi-gcc-4.9 -g -fPIC -I. -I/usr/arm-linux-gnueabi/include/glib-2.0 -I/usr/arm-linux-gnueabi/lib/glib-2.0/include -I/usr/arm-linux-gnueabi/include/gio-unix-2.0 -c generated-code.c
In file included from /usr/arm-linux-gnueabi/include/glib-2.0/gobject/gobject.h:26:0,
from /usr/arm-linux-gnueabi/include/glib-2.0/gobject/gbinding.h:31,
from /usr/arm-linux-gnueabi/include/glib-2.0/glib-object.h:25,
from /usr/arm-linux-gnueabi/include/glib-2.0/gio/gioenums.h:30,
from /usr/arm-linux-gnueabi/include/glib-2.0/gio/giotypes.h:30,
from /usr/arm-linux-gnueabi/include/glib-2.0/gio/gio.h:28,
from generated-code.h:10,
from generated-code.c:11:
generated-code.c: In function ‘adapter1_proxy_get_type’:
generated-code.c:1505:41: error: expected expression before ‘Adapter1Proxy’
G_ADD_PRIVATE (Adapter1Proxy)
^
/usr/arm-linux-gnueabi/include/glib-2.0/gobject/gtype.h:1292:105: note: in definition of macro ‘G_DEFINE_TYPE_WITH_CODE’
#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
^
/usr/arm-linux-gnueabi/include/glib-2.0/gobject/gtype.h:1439:61: error: expected ‘;’ before ‘{’ token
#define G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \
^
/usr/arm-linux-gnueabi/include/glib-2.0/gobject/gtype.h:1292:105: note: in definition of macro ‘G_DEFINE_TYPE_WITH_CODE’
#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
^
generated-code.c:1506:26: note: in expansion of macro ‘G_IMPLEMENT_INTERFACE’
G_IMPLEMENT_INTERFACE (TYPE_ADAPTER1, adapter1_proxy_iface_init));

・・・
-----

比較として、CentOS 7.2上でTinyBのC/C++ソースのコンパイルは
できているのですが、Armadillo-IoT上でJavaからJNI経由でBLE通信
したいと考えています。

ビルド方法が分かるようでしたら、教えて頂けると助かります。

宜しくお願い致します。

コメント

> arm-linux-gnueabi-gcc-4.9 -g -fPIC -I. -I/usr/arm-linux-gnueabi/include/glib-2.0 -I/usr/arm-linux-gnueabi/lib/glib-2.0/include -I/usr/arm-linux-gnueabi/include/gio-unix-2.0 -c generated-code.c
> In file included from /usr/arm-linux-gnueabi/include/glib-2.0/gobject/gobject.h:26:0,
> from /usr/arm-linux-gnueabi/include/glib-2.0/gobject/gbinding.h:31,
> from /usr/arm-linux-gnueabi/include/glib-2.0/glib-object.h:25,
> from /usr/arm-linux-gnueabi/include/glib-2.0/gio/gioenums.h:30,
> from /usr/arm-linux-gnueabi/include/glib-2.0/gio/giotypes.h:30,
> from /usr/arm-linux-gnueabi/include/glib-2.0/gio/gio.h:28,
> from generated-code.h:10,
> from generated-code.c:11:
> generated-code.c: In function ‘adapter1_proxy_get_type’:
> generated-code.c:1505:41: error: expected expression before ‘Adapter1Proxy’
> G_ADD_PRIVATE (Adapter1Proxy)

ATDE5に入っている glib が 2.32 なのが原因ですね。 G_ADD_PRIVATE は、2.38から入っています。
https://developer.gnome.org/gobject/unstable/gobject-Type-Information.h…

glibのバージョンを上げるのが1番なのですが...。

> ATDE5に入っている glib が 2.32 なのが原因ですね。 G_ADD_PRIVATE は、2.38から入っています。
> https://developer.gnome.org/gobject/unstable/gobject-Type-Information.h…
>
> glibのバージョンを上げるのが1番なのですが...。

元のbluez用のdbusインタフェース定義ファイルから、現状のATDE5に入っているgdbus-codegen
を用いて、generated-code.[ch]を生成する方法で試してみようと思います。とりあえず、コンパイルは
通りました。

ATDE5に入っているgdbus-codegenを用いて、以下のBlueZ用のD-Bus I/F定義ファイルから

 https://github.com/intel-iot-devkit/tinyb/blob/master/src/org.bluez.xml

Cコードを再作成して手直したり、debファイルを追加インストールしたりと、TinyBのJNI共有
ライブラリの作成に手間が掛かりましたが、OSGiバンドル化して、以下のサンプルアプリを
Armadillo-IoT G1で動作させることができました。

 https://github.com/intel-iot-devkit/tinyb/blob/master/examples/java/Hel…
 (TI SensorTag CC2650から温度情報を取得するサンプル)