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, &param_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没有链接库

Logo

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

更多推荐