基于Android Studio的OpenCL环境配置

工具准备:
手机一台(这里以小米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]或在评论区留言。

猜你喜欢

转载自blog.csdn.net/weixin_48848716/article/details/108013911