唉,嘗試了很多天之后,經(jīng)歷各種各樣報(bào)錯(cuò),查找好幾天,解決五分鐘,終于可以在Android Studio上使用opencl?。。。?/span>
一、查看自己手機(jī)支不支持opencl,下載opencl-z軟件
鏈接:https://pan.baidu.com/s/16irhsWaBLGXjy96zPCa7MQ
提取碼:1233
二、開(kāi)始操作
?????? 一、先下載platform-tools,這樣子就可以使用adb命令了。
?????? 二、adb shell 命令進(jìn)入手機(jī)(手機(jī)已經(jīng)連接,并且處于usb調(diào)試模式)
?????? 三、進(jìn)入 cd /system/vendor/lib 看看有沒(méi)有 libopencl.lib
?????? 四、把opencl.so文件拉到電腦來(lái)(隨意一個(gè)地方),放到指定目錄(android studio)
adb pull /system/vendor/lib/libOpenCL.so d:/opencl
????????五、編譯,運(yùn)行
????????????????1.cmakelist.txt添加庫(kù)文件
add_library(
??????? OpenCL
??????? SHARED
??????? IMPORTED)
set_target_properties(OpenCL PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jinLibs/${ANDROID_ABI}/libOpenCL.so)
target_link_libraries(
????? ??myopencldemo
??????? OpenCL
??????? ${log-lib})
????????????????2.app下的build.gradle添加內(nèi)容
externalNativeBuild {
?? cmake {
??????? abiFilters 'arm64-v8a'
??? }
}
ndk{
???? abiFilters 'arm64-v8a' // 指定編譯
?}
不指定編譯的話,貌似會(huì)出現(xiàn)錯(cuò)誤error adding symbols: File in wrong format clang++.exe: error: linker command failed with exit code 1
????????????????3. 在native-lib.cpp中使用OpenCL
//添加頭文件
#include <android/log.h>
#include <android/native_window_jni.h>
#include <CL/cl.h>
#include <CL/cl_platform.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_INFO,"David",__VA_ARGS__)
?//添加代碼
??? cl_platform_id *platforms;//查詢后獲得的平臺(tái)列表,存放所有平臺(tái)的ID
??? cl_uint num_platforms;//當(dāng)前可查詢的平臺(tái)的數(shù)量
??? jint buffer;//創(chuàng)建一個(gè)buffer用以緩存平臺(tái)數(shù)量,并傳遞;
??? clGetPlatformIDs(0, NULL, &num_platforms);
??? //當(dāng)?shù)诙€(gè)參數(shù)為NULL時(shí),函數(shù)將會(huì)查詢當(dāng)前可用平臺(tái)的數(shù)量,并保存在第三個(gè)參數(shù);
??? platforms = new cl_platform_id[num_platforms];//查詢后獲得的平臺(tái)列表,存放所有平臺(tái)的ID
??? clGetPlatformIDs(num_platforms ,platforms ,NULL);
??? //獲取平臺(tái)數(shù)量后可以查詢平臺(tái),將查詢到的平臺(tái)ID保存在第二個(gè)列表參數(shù)中
??? buffer = num_platforms;
??? LOGD("平臺(tái)數(shù):%d\n",buffer);
??? LOGD("平臺(tái)ID:%d\n",platforms);
LOGD("=============================================\n");
?????? ????????4.那肯定是錯(cuò)誤了。。。。,缺少庫(kù)文件
????????? 引入,又發(fā)現(xiàn)再缺少庫(kù)文件。。。。
?????? ????????所以說(shuō),還是看下缺少啥文件把。。。。。linux系統(tǒng)下,objdump命令查看
objdump -x libOpenCL.so | grep NEEDED
終于找全了,開(kāi)心,應(yīng)該這次穩(wěn)了?。。。?!
(根據(jù)手機(jī)不同,可能需要庫(kù)會(huì)不一樣)
????????六、錯(cuò)誤排查
?????? 1、Fatal signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xc5614e64 in tid 22126
?????? 一個(gè)錯(cuò)誤,一杯水,半天過(guò)去。這個(gè)問(wèn)題據(jù)說(shuō)是是因?yàn)檫@幾種情況。
第一空指針問(wèn)題;第二函數(shù)有返回值,但是結(jié)束了沒(méi)有返回。
但,我沒(méi)有解決,也沒(méi)有這問(wèn)題,那么簡(jiǎn)單的程序,是不是。。。
????????2、一頓操作,看logcat(terminal窗口 adb logcat | findstr “程序名”),發(fā)現(xiàn)有這幾個(gè)問(wèn)題。
Access denied finding property "ro.odm.prev.product.name"
/Zygote: Unable to open libbeluga.so: dlopen failed: library "libbeluga.so"
以為是權(quán)限問(wèn)題,開(kāi)始給手機(jī)刷root權(quán)限,又是一晚上過(guò)去,好在解決了,刷成功,不懂,可看
Realme x 刷有root權(quán)限_czhunian的博客-CSDN博客
????????3、刷完之后,覺(jué)得又行了,一編譯運(yùn)行,好吧,又出現(xiàn)問(wèn)題。。。。
?????? UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_Unwind_Resume"
? 找到一個(gè)命令readelf -sW libnative-lib.so| grep _Unwind
??The?UND in the?Ndx?column?means?Undefined symbol ??參考鏈接:https://github.com/google/oboe/issues/966????????然后呢???又是半天過(guò)去,唉
????????七、最后放棄,那是不可能的,重新新建一個(gè)項(xiàng)目,從頭開(kāi)始
新問(wèn)題來(lái)了:A/libc: Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xe1f7fb
雖然跟上面第一個(gè)問(wèn)題不是很像,但是找了一圈,好像導(dǎo)致原因都是一樣,就是空指針異常,沒(méi)有返回值啥的,又是沒(méi)有解決的問(wèn)題。。。,但是又學(xué)到一個(gè)新知識(shí)
addr2line -f -e libnative-lib.so 0xe1f7fb90,查看到底是哪個(gè)函數(shù)出現(xiàn)!??!
-e 輸出錯(cuò)誤代碼行數(shù)和文件路徑 -f 輸出函數(shù)名
addr2line在ndk下
? ? ? ?
?但是問(wèn)題又來(lái)了,輸出是 ???,好吧,絕望了。。。
搜起來(lái),找到一個(gè)不錯(cuò)的解決方案,可以看看
addr2line 輸出為?:0可能原因_qq_23101811的博客-CSDN博客_add2line顯示???
但是死活搞不定,太菜了。。。。
說(shuō)是要編譯成debug的,cmakelist.txt 添加命令,add_definitions("-Wall -g")
但是還是不行,所以說(shuō)擺爛了,不搞了,累了。。。
????????八、又來(lái)了,重新新建項(xiàng)目,換個(gè)手機(jī)
?????? ????????發(fā)現(xiàn),運(yùn)行成功了,wc,喜大普奔,一看平臺(tái)數(shù)0,md,為什么。。。。
????????1.先看看為什么之前的不行,現(xiàn)在的項(xiàng)目編譯運(yùn)行,直接通過(guò)了,一對(duì)比,發(fā)現(xiàn)
? ? ? ? ??
?這邊不能引入動(dòng)態(tài)庫(kù),咦,為什么啊,明明動(dòng)態(tài)庫(kù)要加載進(jìn)行,不然怎么找得到!wc,后面想一想可能是因?yàn)槭謾C(jī)有默認(rèn)的執(zhí)行環(huán)境,她自己去里面找了找了,之前的用了自己加載的反而會(huì)出錯(cuò)。
????????2.一看,clGetPlatformIDs函數(shù) 返回CL_INVALID_VALUE(-30)
開(kāi)始各種操作了,報(bào)錯(cuò)是 參數(shù)不合法,可是簡(jiǎn)單啊,咋那么可能不合法。。。
郁悶一晚上
????????3.算是長(zhǎng)征結(jié)束了,真的喜大普奔?。。?!
換個(gè)操作搜,問(wèn)Android studio 使用opencl,發(fā)現(xiàn)了問(wèn)題,唉
在Android Studio上使用OpenCL_gaussrieman123的博客-CSDN博客_opencl 安卓
說(shuō)是,因?yàn)間oogle是不公開(kāi)支持opencl的,所以NDK中并不會(huì)有l(wèi)ibOpenCL.so,這個(gè)庫(kù)都是放在各個(gè)廠家的庫(kù)中,比較常見(jiàn)的位置是"system/vendor/lib/libOpenCL.so",把所需的動(dòng)態(tài)庫(kù)全部pull出來(lái),看成app的私有庫(kù)來(lái)加載,可以解決編譯的問(wèn)題,但是在使用clGetPlatforms時(shí),會(huì)找不到可用的platform;使用stub,將libOpenCL.so動(dòng)態(tài)加載,libopencl.c完成適配平臺(tái)和封裝接口的工作,主要用到dlopen和dlsym,前者用來(lái)加載vendor支持的CL動(dòng)態(tài)庫(kù),后者用來(lái)映射接口;這邊直接將stub編譯成一個(gè)靜態(tài)庫(kù)使用即可。
歷時(shí)快一周的簡(jiǎn)單的opencldemo,終于可以運(yùn)行成功。算是對(duì)得起這幾天了,唉。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-492075.html
代碼:GitHub - czhunian/opencldemo at master文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-492075.html
到了這里,關(guān)于Android studio 使用opencl庫(kù)(realme 手機(jī))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!