工具準備:
手機一臺(這里以小米6為例)
Android Studio 4.0.0
OpenCL的頭檔案庫(去官網找最新版也是可以的)
第一步 創建一個支持C++的程式檔案
注意:C++的標準使用C++11,全網都說她很好(doge)
第二步
在cpp目錄下將CMakeLists.txt移動到src的目錄下;并打開它,(這個是一個老版本的方法,新版本大家可以自行探索,)
第三步
打開你的native-lib.cpp檔案,摁住Ctrl打開 jni.h 這個頭檔案,并復制他的地址,
用檔案夾的地址搜尋放置這個 jni.h 并將放置OpenCL頭檔案的檔案夾粘貼到里面去,
第四步
放置OpenCL相關的so庫
1.在你的Android專案下的main函式目錄下創建一個 jniLibs 目錄,并在jniLibs目錄下創建libs目錄,
2.接下來,在libs目錄下創建一串目錄,看截圖,具體什么含義這里不做贅述,
3.從你的手機里面OpenCL的so庫以及一系列的依賴庫放到對應的架構檔案夾中,(armeabi-v7a對應的是32位的架構,我們也只需要用這個就可以了,所以你應該在手機的/system/vendor/lib目錄下將這些檔案拖到這里面去,)
注意:我的這臺小米6是高通驍龍的CPU,其他品牌的CUP你們自己上網去查找so庫的放置位置,

第五步
撰寫你的CMakeLists.txt檔案,想要深入了解可以去網上查找相關文章,這里針對OpenCL進行示范,
第一添加這個代碼塊:
#IMPORTED入口
#set_target_properties設立目標的屬性,
set_target_properties(
libOpenCL
PROPERTIES
IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/libs/${ANDROID_ABI}/libOpenCL.so
)
下面對一些函式進行解釋:
{CMAKE_SOURCE_DIR} 是你的CMakeLists.txt的相對路徑; {ANDROID_ABI} 是根據CPU架構選擇目錄,具體自查了解,
第六步
撰寫你App目錄下的build.gradle檔案,
//自己找到這些代碼,然后修改,
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'armeabi-v7a','arm64-v8a'
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
version "3.10.2"
}
}
sourceSets{
main{
jniLibs.srcDirs = ['src/main/jniLibs/libs/armeabi-v7a']
}
}
修改好后Rebuild一下,(build->rebuild project)
至此,環境搭建完成,
下面我們來進行檢驗,這里只做簡單檢驗,并不做完整程式,
布局檔案:寫兩個TextView用于顯示回傳資訊
MainActivity:利用JNI介面在C++檔案中創建函式
在你C++檔案新創建的JNI介面運行塊中放入如下代碼:
/*全域變數*/
cl_platform_id *platforms;//查詢后獲得的平臺串列,存放所有平臺的ID
cl_uint num_platforms;//當前可查詢的平臺的數量
/*第一個JNI,這是查詢你的平臺數量,*/
jint buffer;//創建一個buffer用以快取平臺數量,并傳遞;
clGetPlatformIDs(0, NULL, &num_platforms);
//當第二個引數為NULL時,函式將會查詢當前可用平臺的數量,并保存在第三個引數;
platforms = new cl_platform_id[num_platforms];//查詢后獲得的平臺串列,存放所有平臺的ID
//platforms = new cl_platform_id[num_platforms];
clGetPlatformIDs(num_platforms ,platforms ,NULL);
//獲取平臺數量后可以查詢平臺,將查詢到的平臺ID保存在第二個串列引數中
buffer = num_platforms;
LOGI("平臺數:%d\n",buffer);
LOGI("平臺ID:%d\n",platforms);
return buffer;
/*第二個JNI,查詢你的平臺名字*/
char buffer[1024];//創建一個buffer,存放查詢的資訊名字,
clGetPlatformInfo(platforms[0], CL_PLATFORM_NAME, sizeof(buffer),buffer,NULL);
//查詢平臺資訊并保存在第四個引數;
LOGI("平臺名稱:%s",buffer);
return env->NewStringUTF(buffer);
如果你能夠顯示出或者說看到你的平臺資訊就證明環境配置成功了,好久沒做不知道有啥坑,
最后給大家留下問題:
1.如何用ADB到處so庫?
2.同樣的方法在應用在其他的C++頭檔案環境配置是否可行?
如果大家有什么好的提議或想法,歡迎私信[email protected]或在評論區留言,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/1381.html
標籤:其他
