2017年2月8日水曜日

バーコード読み込みについて

こんばんは。

本棚で、バーコード読み込みに、すごく苦労しました。

本についているバーコード読み込みは、ZBarが優秀らしいと書かれていたので、ZBarを採用することにしました。

ZBarのライブラリは、以下で、ダウンロードできます。

https://sourceforge.net/projects/zbar/files/AndroidSDK/

0.2の方が最新のようです。
しかし!これを落としてきて、実装して、実機で動かそうとしたら、例外発生!

例外内容:
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.bnbnapp.bookshelf, PID: 5212
                  java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.bnbnapp.bookshelf-2/lib/arm/libiconv.so: has text relocations

例外箇所:
        System.loadLibrary("iconv");

上記の箇所で落ちます。色々試したのですが、上手くいきません。
どうやら、Android 6.0からテキスト再配置をサポートしていないそうです。
この問題を解決するには、ライブラリをコンパイルする際に、gccのコンパイルオプション、-fPICを指定する必要があるそうです。

以下、gccのコンパイルオプション-fPICと-fpicの違いは?より。

「gcc でプログラムをコンパイルする場合に、-fPIC がよく使われます。

-fPIC は、UNIX(Linux)で共有ライブラリ(shared object, シェアードオブジェクト)を作成するときに使われるオプションです。

PIC とは Position-Independent Code の略です。日本語では、位置独立コードとなります。または、位置独立実行形式です。 PIC でコンパイルされたコードは、メインメモリのどこに配置されても、絶対アドレスに関わらず、正しく実行できます。 」

じゃあ、ライブラリを-fPICをつけて、コンパイルしなおせばいいのかと思ってからが、大変でした・・・。

libiconvのソースを落として、NDKでクロスコンパイル、Cygwinでコンパイル、CentOSのLinuxでコンパイル、と試しても、コンパイルエラーとなってしまい、だめでした。

そこで、見つけたのが、以下のページです。

https://github.com/dm77/barcodescanner


コンパイルに成功した上に、その手順まで書いてあります!
しかし、その通りにやったのですが、やはりコンパイルエラーとなります。
iconvのソースは、よくわからなかったのですが、とりあえず、エラーを除去して、動かしてみたのですが、今度は別の例外(たしかmemclrがないというような例外) になってしまい、力尽きました。

結局、dm77さんのライブラリを使わせてもらうことにしました。



0 件のコメント:

コメントを投稿