在linux交叉编译安卓手机ARM Mali 的OpenCL代码
1.下载交叉编译工具链NDK下载后文件夹名如:android-ndk-r21e2.main.cpp#include<iostream>#include<CL/opencl.h>using namespace std;//根据平台ID得到平台名字string getPlatformName(const cl_platform_id pid) {size_t param_val
1.下载交叉编译工具链NDK
下载后文件夹名如:android-ndk-r21e
2.main.cpp
#include<iostream>
#include<CL/opencl.h>
using namespace std;
//根据平台ID得到平台名字
string getPlatformName(const cl_platform_id pid) {
size_t param_value_size;
clGetPlatformInfo(pid, CL_PLATFORM_NAME, 0, NULL, ¶m_value_size);
char *param_value = new char[param_value_size];
clGetPlatformInfo(pid, CL_PLATFORM_NAME, param_value_size, param_value, NULL);
return param_value;
}
int main()
{
cl_uint num_platforms;
clGetPlatformIDs(0, NULL, &num_platforms);
cl_platform_id* platforms = new cl_platform_id[num_platforms];
clGetPlatformIDs(num_platforms, platforms, NULL);
for (cl_uint i = 0; i < num_platforms; i++) {
string platname = getPlatformName(platforms[i]);
cout << "<" << i << "> " << "Platform name is :" << platname << endl;
}
cout << "hello" << endl;
return 0;
}
3.从手机把库pull出来
一般库都在
/system/vendor/lib64
/vendor/lib64
/system/lib64
里面
库如下: 可能由于版本不同需要的库不同,在编译的时候一般会遇到类似
warning: libcutils.so, needed by /root/MNN-master/project/android/build_64/android-lib/libOpenCL.so
遇到话再去手机pull出来就可以.然后必须在target_link_libraries把相关的库链接上去
OpenCL
cutils
log
utils
base
c++
processgroup
vndksupport
cgrouprc
dl_android
上述库都带有前缀lib和后缀.so
ld-android.so
/system/lib64:
libion.so
android.hardware.graphics.common@1.0.so
libnativewindow.so
libz.so
libc_secshared.so
libutilscallstack.so
/system/vendor/lib64/egl/libGLES_mali.so
4.CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(main)
set(CMAKE_CXX_STANDARD 11)
# include_directories("/root/ComputeLibrary-master/include")
link_directories("/root/MNN-master/project/android/build_64/android-lib") #你库放的路径
set(path "/root/MNN-master/project/android/build_64/android-lib") #你库放的路径
add_executable(main main.cpp)
target_link_libraries(main
OpenCL
cutils
log
utils
base
c++
processgroup
vndksupport
cgrouprc
dl_android
"/root/MNN-master/project/android/build_64/android-lib/ld-android.so")
5.run.sh
添加环境变量export ANDROID_NDK=你的ndk路径
mkdir -p build
cd build
rm -rf *
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NATIVE_API_LEVEL=android-26
make -j4
6.可能遇到的问题
(1): incompatible target 或者 warning: skipping incompatible
原因:-DANDROID_ABI设置不对,需要查询你的arm架构
Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。
主流的ABI包括:
armeabiv-v7a: 第7代及以上的 ARM 处理器。
arm64-v8a: 第8代、64位ARM处理器。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
(2): 很多的undefined reference to
原因:-DANDROID_NATIVE_API_LEVEL版本不对。
查询Android SDK版本与API等级对照表。不过可以设高,不能设低。比如我的Mate30就是26 27 28都正确,25就报错。
(3): target_link_libraries没有链接库

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)