如何在Android系統上使用libdmtx來掃描DataMatrix?


常見的二維條碼除了QR Code外,還有另外一種經常會使用在商品上的DataMatrix條碼。DataMatrixQR Code一樣,都是二維矩陣式的條碼,但它的體積可以比QR Code還要小,印刷在商品上不會太佔位置。但也由於DataMatrix的體積小、密度高,造成機器辨識的時候會需要更多的時間,而且辨識成功率也會下降一些。在Android系統上雖然可以使用zBar來掃描QR Code,但是zBar並沒有支援DataMatrix,所以如果想要掃描DataMatrix,必須用別種方式才行,本篇文章提供的是libdmtx的解決方案。

libdmtx

libdmtx是一個用來編碼與解碼DataMatrix條碼的開源函式庫,以C/C++來實作,因此有著不錯的效率。官方網站網址如下:

http://www.libdmtx.org/

官方並沒有針對Android平台做編譯配置,不過也別擔心,libdmtx並不是一個龐大的函式庫,編譯起來還算是輕鬆容易。

編譯libdmtx For Android

編譯環境:Linux Mint 17 MATE

取得libdmtx

libdmtx的原始碼可以直接在官方網站上取得。官方網站提供三種專案目錄,分別是libdmtx、dmtx-utils、dmtx-wrappers,在這裡我們只需要用到libdmtx和dmtx-wrappers即可。

加入JNI支援至Android專案

在編譯libdmtx For Android時,會使用到JNI,所以要讓Android專案能支援JNI。如果您還不知道怎麼樣加入JNIAndroid專案中,可以參考這篇文章:

https://magiclen.org/android-jni/

如何在Android系統上使用libdmtx來掃描DataMatrix?

libdmtx和dmtx-wrappers原始碼目錄放置於Android專案下

把剛才下載下來的libdmtx和dmtx-wrappers原始碼目錄放置在Android的專案下,為了要讓.mk設定檔能直接套用,需確定目錄名稱分別為「libdmtx」和「dmtx-wrappers」。

如何在Android系統上使用libdmtx來掃描DataMatrix?

加入Android.mk和Application.mk至JNI目錄

在此提供筆者編譯libdmtx時所使用的Android.mk和Application.mk配置檔案。下載網址:

//file.magiclen.org/index.php?file=6c6962646d74782d6d6b2e726172

配置libdmtx

將終端機的工作目錄移動到libdmtx目錄下,執行以下指令來配置libdmtx的編譯設定:

./configure

如果configure檔案不存在,必須先執行以下指令來產生:

./autogen.sh

如何在Android系統上使用libdmtx來掃描DataMatrix?

如何在Android系統上使用libdmtx來掃描DataMatrix?

修改JNI程式

libdmtx有提供JNI介面用的.c檔案,只是並沒有針對Android做調整,因為有使用到java.awt.Point類別,而java.awt.Point在Android SDK中卻是不存在的。因此如果不修改JNI程式的話,在Android環境下會無法使用。JNI程式位於dmtx-wrappers目錄下的「java/native」目錄裡需要修改「org_libdmtx_DMTXImage.c」裡的「java/awt/Point」,將其取代成「org/libdmtx/DMTXPoint」,這是筆者從Java SE原始碼中提取出來的Point類別。

如何在Android系統上使用libdmtx來掃描DataMatrix?

使用ndk-build來編譯

將終端機下的工作目錄移動到Android專案的目錄下,執行以下指令使用Android NDK開始編譯libdmtx

ndk-build

如何在Android系統上使用libdmtx來掃描DataMatrix?

編譯成功的話可以看到以下畫面:

如何在Android系統上使用libdmtx來掃描DataMatrix?

並且可以在「libs」目錄中找到編譯出來的.so檔案。

如何在Android系統上使用libdmtx來掃描DataMatrix?

使用libdmtx For Android

編譯出libdmtx的.so檔之後,要如何在Android SDK下使用呢?由於我們已經有使用dmtx-wrappers目錄下的JNI程式,因此不需再撰寫JNI程式。只要在Android SDKJava程式中讀入.so函式庫,並宣告出Native的方法,即可使用libdmtx的功能。這部份的程式在dmtx-wrappers目錄下的「java」目錄中可以找到,但是這不是給Android用的,會發生找不到類別的問題。因此筆者自己修改了部份程式,程式碼可以用以下連結下載:

//file.magiclen.org/index.php?file=6c6962646d74782d6a6176612e726172

只要將程式碼加到Android專案中的「src」目錄下就可以使用。

關於作者

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章