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



libdmtx

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

官方並沒有針對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。如果您還不知道怎麼樣加入JNI至Android專案中,可以參考這篇文章:

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

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

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

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

配置libdmtx

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

./configure

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

./autogen.sh

修改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類別。

使用ndk-build來編譯

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

ndk-build

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

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

使用libdmtx For Android

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

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