其實(shí)去年就已經(jīng)把Android上OpenCL的demo做出來了,但是由于種種原因一直沒有開源–
嗯現(xiàn)在就不吝嗇了~奉獻(xiàn)給大家~
后面在Android上還實(shí)現(xiàn)了很多種并行化的算法,,比如SHA-1、HDR,、K-means,、NL-means,、SRAD等等,會在近期整理好之后開源的。
原文發(fā)表在了異構(gòu)開發(fā)技術(shù)社區(qū)
整理成教程是隊(duì)友做的,十分感謝~
原博文地址
隊(duì)友的博客
下面是干貨: Android平臺利用OpenCL框架實(shí)現(xiàn)并行開發(fā)初試
首先,,我們需要完成開發(fā)環(huán)境的搭建,。由于目標(biāo)是安卓平臺,我們需要安裝JAVA SDK,、Android SDK,、Eclipse以及ADT插件,這些工具的安裝教程很多,,這里就不再贅述了,,主要介紹Cygwin與NDK的環(huán)境搭建,。 第二步,,從http://www.
下載Cygwin工具。由于NDK完成的工作是允許開發(fā)人員使用本地代碼(如C/C++)進(jìn)行Android
APP功能開發(fā),,而在開發(fā)的過程中大多涉及到GCC環(huán)境下的編譯,、運(yùn)行,我們采用了Cygwin模擬Linux編譯環(huán)境,。我安裝的時候?yàn)榱朔奖憔桶阉械?文件都安裝了,,體積不大,1G左右,。 安裝完成后,,運(yùn)行”Cygwin.bat”,可以通過以下幾個方法檢驗(yàn)安裝是否成功,。(這里參照了以前的一些資料) (1)cygcheck –c cygwin(正常顯示如圖)
(2)make –v,,返回make命令的版本信息
3)gcc -v,返回gcc命令的版本信息
第三步,,配置NDK的系統(tǒng)環(huán)境變量,為了避免編譯時警告,,可采用Linux風(fēng)格的路徑,,如我的NDK安裝路徑為:“D:\android-ndk-r8-
windows \android-ndk-r8”,,在系統(tǒng)變量中名為“ndk”的變量路徑為:“/cygdrive/
android-ndk-r8-windows/ android-ndk-r8” 如圖:
(安裝時不要勾選“Group items by category”選項(xiàng),否則會出現(xiàn)列表為空的情況)。然后在Window->preferences->Android->本機(jī)開發(fā)選項(xiàng)中添加NDK的安裝路徑,。
其次,我會簡要的介紹OpenCL在Android開發(fā)過程中的一些設(shè)置和代碼。在Android平臺實(shí)現(xiàn)并行化的過程中,,我主要遵循下面的框圖進(jìn)行:
主要思路就是利用JAVA中的JNI接口,,結(jié)合Cygwin環(huán)境和NDK工具,將OpenCL實(shí)現(xiàn)的并行算法編譯為可以被Android工程調(diào)用的libSobelFilter.so(lib***.so均可),,然后在程序中調(diào)用該文件中的算法實(shí)現(xiàn)并行,。 在
Eclipse工程中jni文件夾下需要創(chuàng)建如下兩個文件:Android.mk以及Application.mk,相當(dāng)于該程序?qū)?yīng)的makefile
文件,,前者定義了一系列規(guī)則來制定編譯文件的目標(biāo)和文件編譯的順序,,后者定義了程序平臺版本和編譯器版本等內(nèi)容。具體實(shí)現(xiàn)為,,Android.mk文件:
Application.mk文件:
然后將OpenCL頭文件拷貝到j(luò)ni文件夾下,,供工程編譯時調(diào)用:
接下來需要我們按照OpenCL的框架流程進(jìn)行并行化的初始化和內(nèi)核入隊(duì)操作,主要包括: 1)
獲得平臺clGetPlatformIDs,;2)創(chuàng)建上下文clCreateContexFromType,;3)通過上下文得到設(shè)備信息
clGetContextInfo;4)為相應(yīng)設(shè)備創(chuàng)建commandQueue,;5)創(chuàng)建源程序,,生成kernel;6)分配buffer空間,設(shè)置程
序參數(shù),;7)執(zhí)行kernel,,clEnqueueNDRangeKernel;8)從buffer讀回數(shù)據(jù)clEnqueueReadBuffer,。 這里幾個操作時OpenCL的固定流程,,具體代碼很多,請大家參看下我的源碼,,這里就不寫了,。 這里我要指出的是由于移動平臺的特殊性,我們在程序中對幾個宏變量進(jìn)行了定義:
上述幾個Android平臺需要的文件在不同版本的安卓系統(tǒng)中有不同的位置,,上例 為Android 4.3版本的文件位置,,在之前版本中文件多數(shù)位于”/system/lib/”文件夾下。 程序的核函數(shù)如下:
此外,,該程序使用了OpenCV的相關(guān)函數(shù)完成圖像操作,,因此需要在對應(yīng)的安卓手機(jī)上安裝OpenCV-Manager來完成對OpenCV函數(shù)的調(diào)用工作(可從http:///下
載相關(guān)資料和安裝包)。同時,,為了程序編譯的方便,,建議將程序文件放置到OpenCV-android-sdk的samples目錄下,同時在
Eclipse的項(xiàng)目屬性Android選項(xiàng)中將"…\OpenCV-2.4.8-android-sdk\sdk\java"工程加入Android工
程中,,如圖所示:
在完成運(yùn)行環(huán)境的配置后,,在Cygwin中完成該項(xiàng)目的編譯和庫文件生成工作,如下圖所示:
可在項(xiàng)目工程目錄下的libs/armeabi-v7a下查看生成的.so文件(libSobelFilter.so):
至此,,Sobel濾波程序已經(jīng)編譯完成,。下面介紹一些運(yùn)行結(jié)果。
|