こんばんは。
本棚で、バーコード読み込みに、すごく苦労しました。
本についているバーコード読み込みは、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 件のコメント:
コメントを投稿