Android OpenCL测试程序,使用dlopen动态加载libOpenCL.so库

如何用源码编译包含有opencl的opencv ~/opencl_sdk ├── include │   └── CL │       ├── cl_d3d10.h │       ├── cl_d3d11.h │       ├── cl_dx9_media_sharing.h │       ├── cl_egl.h │       ├── cl_ext.h │       ├── cl_gl_ext.h │ 阅读详情
AI摘要

本文详细介绍如何在Android平台上配置并使用OpenCL进行图像处理,包括环境搭建、头文件下载、native函数声明、ocl.cpp文件编写等步骤,并提供完整示例。

1、环境配置:

Android NDK
Android studio

2、下载头文件:

大家可以通过这个链接下载头文件:

http://download.youkuaiyun.com/detail/wjskeepmaking/9811058


3、声明native函数并生成头文件:

public class OpenclTest {


    public String testOpencl(){
        return testopencl();
    }
    public String getplatformName(){
        return getPlatformName();
    }
    public String getdeviceName(){
        return getDeviceName();
    }

    public native String  testopencl();
    public native String getPlatformName();
    public native String getDeviceName();
}

进入package的同级目录,利用javah命令生成头文件:


4、编写ocl.cpp文件:

//
// Created by wujs on 2017/4/11.
//
#include "CL/cl.h"
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include <dlfcn.h>
#include "topencl.h"
#include"com_pax_imagesobelfilter_OpenclTest.h"
#include <android/log.h>
#define LOG_TAG "test"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
#define LEN(arr) sizeof(arr) / sizeof(arr[0])
#define N 1024
#define NUM_THREAD 128

cl_uint num_device;
cl_uint num_platform;
cl_platform_id *platform;
cl_device_id *devices;
cl_int err;
cl_context context;
cl_command_queue cmdQueue;
cl_mem buffer,sum_buffer;
cl_program program ;
cl_kernel kernel;
const char* src[] = {
        "  __kernel void redution(  \n"
                "  __global int *data,     \n"
                "  __global int *output,   \n"
                "  __local int *data_local   \n"
                "  )  \n"
                " {   \n"
                "  int gid=get_group_id(0);   \n"
                "  int tid=get_global_id(0);    \n"
                "  int size=get_local_size(0);   \n"
                "  int id=get_local_id(0);     \n"
                "  data_local[id]=data[tid];   \n"
                "  barrier(CLK_LOCAL_MEM_FENCE);   \n"
                "  for(int i=size/2;i>0;i>>=1){    \n"
                "      if(id<i){   \n"
                "          data_local[id]+=data_local[id+i];   \n"
                "      }   \n"
                "      barrier(CLK_LOCAL_MEM_FENCE);   \n"
                "  }    \n"
                "  if(id==0){    \n"
                "      output[gid]=data_local[0];   \n"
                "  }    \n"
                " }   \n"

};
int num_block;
int  test()
{
    int* in,*out;
    num_block=N/NUM_THREAD;
    in=(int*)malloc(sizeof(int)*N);
    out=(int*)malloc(sizeof(int)*num_block);
    for(int i=0;i<N;i++){
        in[i]=1;
    }
    initFns(); //load library
    Init_OpenCL();
    Context_cmd();
    Create_Buffer(in);
    Create_program();
    Set_arg();
    Execution();
    CopyOutResult(out);
    int sum=0;
    for(int i=0;i<num_block;i++){
        sum+=out[i];
    }
    return sum;
}

JNIEXPORT jstring JNICALL Java_com_pax_imagesobelfilter_OpenclTest_testopencl(JNIEnv * env, jobject thisobject)
{
    char result[10];
    LOGD("test_opencl start to test");
    sprintf(result,"%d\n",test());
    return env->NewStringUTF(result);
}
JNIEXPORT jstring JNICALL Java_com_pax_imagesobelfilter_OpenclTest_getPlatformName(JNIEnv *env , jobject thisobject)
{
    char buffer[1024];
    LOGD("getPlatformName start");
    clGetPlatformInfo(platform[0],CL_PLATFORM_NAME,sizeof(buffer),buffer,NULL);
    return env->NewStringUTF(buffer);
}
JNIEXPORT jstring JNICALL Java_com_pax_imagesobelfilter_OpenclTest_getDeviceName(JNIEnv *env , jobject thisobject)
{

    char buffer[1024];
    LOGD("getDeviceName start");
    clGetDeviceInfo(devices[0],CL_DEVICE_NAME,sizeof(buffer),buffer,NULL);
    return env->NewStringUTF(buffer);
}

void Init_OpenCL()
{
    LOGD("start init OpenCL");
    size_t nameLen1;
    char platformName[1024];

    err = clGetPlatformIDs(0, 0, &num_platform);
    LOGD("err=clGetPlatformIDs");
    platform=(cl_platform_id*)malloc(sizeof(cl_platform_id)*num_platform);
    err = clGetPlatformIDs(num_platform, platform, NULL);

    err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,0,NULL,&num_device);
    devices=(cl_device_id*)malloc(sizeof(cl_device_id)*num_device);
    err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,num_device,devices,NULL);

}

void Context_cmd()
{
    context=clCreateContext(NULL,num_device,devices,NULL,NULL,&err);
    cmdQueue=clCreateCommandQueue(context,devices[0],0,&err);
}

void Create_Buffer(int *data)
{

    buffer=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR,sizeof(int)*N,data,&err);
    sum_buffer=clCreateBuffer(context,CL_MEM_WRITE_ONLY,sizeof(int)*num_block,0,&err);
}

void Create_program()
{
    program=clCreateProgramWithSource(context, LEN(src), src, NULL, NULL);
    err=clBuildProgram(program,num_device,devices,NULL,NULL,NULL);
    kernel = clCreateKernel(program, "redution", NULL);
}

void Set_arg()
{
    err=clSetKernelArg(kernel,0,sizeof(cl_mem),&buffer);
    err=clSetKernelArg(kernel,1,sizeof(cl_mem),&sum_buffer);
    err=clSetKernelArg(kernel,2,sizeof(int)*NUM_THREAD,NULL);
}

void Execution()
{
    const size_t globalWorkSize[1]={N};
    const size_t localWorkSize[1]={NUM_THREAD};
    err=clEnqueueNDRangeKernel(cmdQueue,kernel,1,NULL,globalWorkSize,localWorkSize,0,NULL,NULL);
    clFinish(cmdQueue);
}

void CopyOutResult(int*out)
{
    err=clEnqueueReadBuffer(cmdQueue,sum_buffer,CL_TRUE,0,sizeof(int)*num_block,out,0,NULL,NULL);
}

5、创建topencl.h文件和topencl.c文件;

利用dlopen,实现动态加载libOpenCL.so库,由于代码太多,这里就不全部贴出来了,后面会有链接,大家可以去下载,根据自己的实际情况修改,需要修改的地方不会很多。
Note:下面代码是从系统中去加载动态库,这里有个问题,如果大家使用的机器是Android N以下,加载不会出错,但是,如果是Android N或以上的,加载会出现问题,因为从Android N开始,限制了程序对系统私有库(除了Android NDK中提供的那些库)的加载了。针对这种情况,现在的解决方法就是:把需要加载和依赖的库全部导入APP中,直接从APP中去加载,大家可以参阅这篇文章:解决Android N加载系统私有库的错误。

下面是topencl.c的库加载代码:

#define LIB_OPENCL "/system/vendor/lib/libOpenCL.so"
#define LIB_GLES_MALI "/system/vendor/lib/egl/libGLES_adreno.so"
#define LIB_LLVM   "/system/lib/libllvm-a3xx.so"

static void *getCLHandle(){

    LOGD("get_handle");
    void *res = NULL;
    char* so_name="Unknown Shared library for OpenCL";
    res = dlopen(LIB_OPENCL,RTLD_LAZY);
    if(res != NULL){
        so_name = LIB_OPENCL;
    }else{
        res = dlopen(LIB_GLES_MALI,RTLD_LAZY);
    }
    if(res != NULL){
        so_name = LIB_GLES_MALI;
    }else{
        res = dlopen(LIB_LLVM,RTLD_LAZY);
    }
    /*  if(res==NULL){
      res = dlopen("/home/rahul/stream/sdk2.7/lib/x86_64/libOpenCL.so",RTLD_LAZY);
    }*/
    if(res != NULL) {
        so_name=LIB_LLVM;
    } else {
        LOGD("Could not open library :(\n");
    }
    LOGD("Loaded library name:%s\n",so_name);
    return res;
}

6、编写Android.mk文件和Application.mk文件:

android.mk文件:

要根据自己的Opencv4Android的路径去修改OPENCV_ANDROID_SDK

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
OPENCV_ANDROID_SDK := F:\Android\opencv-3.2.0-android-sdk\OpenCV-android-sdk
ifdef OPENCV_ANDROID_SDK
  ifneq ("","$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)")
    include ${OPENCV_ANDROID_SDK}/OpenCV.mk
  else
    include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk
  endif
else
  include ../../sdk/native/jni/OpenCV.mk
endif

LOCAL_MODULE    := ocl
LOCAL_CPPFLAGS	+= -I$(LOCAL_PATH)
LOCAL_SRC_FILES := ocl.cpp topencl.c
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY) 

Application.mk文件:

APP_CPPFLAGS := -frtti -fexceptions
#APP_STL := stlport_static
APP_STL := gnustl_static
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-8

7、编译:

进入 jni 的同级目录,利用ndk-build进行编译:

、

8、程序运行结果:


以上例程是参考这篇博文写的:http://blog.youkuaiyun.com/wcj0626/article/details/26272019#comments。但这个链接中使用静态库进行编译的。所以,我在这里写一个通过 动态加载手机中的OpenCL库的文章,供大家参考使用。我的另一篇文章,使用opencv T-API来获取GPU信息: Opencv4Android的OpenCL的测试,使用Opencv的ocl封装库
代码链接: 优快云
因为Opencv4Android sdk 太大了,所以,我从代码中剔除之后再上传的,如果大家下载学习,要把Opencv4Android SDK 导入和安装OpenCV manager.apk(上面提供了连链接下载,除了X86和X86_64)之后才能正确运行。
如果大家有什么疑问,也请在评论中提出,能回答尽量回答,大家互相学习。

cuda install; ubuntu22安装nvidia驱动 以解Cytoscape3.10找不到libOpenCL.so错; asus k43sd, shinelon e479 cuda install; ubuntu22安装nvidia驱动 以解Cytoscape3.10找不到libOpenCL.so错, Cytoscape3教程 阅读详情

相关推荐

libOpenCL.so

android openCL动态库 arm64-v8a

零基础学习OpenCL(1)-安装OpenCL

说明:因为是刚开始接触OpenGL,所以想先在CPU上试一试,感受一下,所以没有买带GPU的显卡。系统是Fedora19。 首先是下载,我下载的是AMD提供的AMDAPPSDK:http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/,这个英文网站上有各种版本供

gagabook的专栏 2万+

【问题解析】Matlab Function的易错点(Variable Size)

Matlab Function的易错点

CrazyRabbit的博客 9869

Intel OpenCL + Ubuntu安装

Intel OpenCL + Ubuntu安装 因为项目采用Intel开发平台,需要安装Opencl,注意Intel 的OpenVINO开发平台并没有包括Opencl安装,另外安装Intel Opencl SDK. 注意作者本人环境是Ubuntu 16.04,操作系统不是安装到虚拟机环境中,因为虚拟机不能访问到GPU硬件资源 OpenCL Base on CPU or GPU 因特尔的opencl sdk CPU和GPU是分开的,如下图所示 ...

u013928488的博客 3168

MATLAB三元相图实战:从数据准备到高级可视化技巧全解析

本文深入解析了如何使用MATLAB绘制专业的三元相图(ternary plot)。文章从数据归一化、范围映射等预处理技巧入手,详细介绍了散点图、等高线图、凸包计算等高级可视化方法,并提供了多数据集对比与出版级图表美化的实战指南,帮助科研与工程人员高效呈现复杂的三元数据关系。

spark7igniter的博客 258

Alphafold2/multimer本地安装避坑指南:从Conda环境配置到GPU加速实战

本文详细介绍了Alphafold2/multimer本地安装的全流程,从Conda环境配置到GPU加速实战,特别针对常见的报错处理提供了解决方案。通过硬件环境检查、依赖安装技巧、OpenMM补丁应用等步骤,帮助研究人员高效部署蛋白质结构预测工具,提升计算效率。

weixin_29309213的博客 118

android查看libopencl版本,Android OpenCL测试程序,使用dlopen动态加载libOpenCL.so库

1、环境配置:Android NDKAndroid studio2、下载头文件:大家可以通过这个链接下载头文件:http://download.csdn.net/detail/wjskeepmaking/9811058 3、声明native函数并生成头文件:public class OpenclTest {public String testOpencl(){return testopencl()...

weixin_34794738的博客 1290

从数据同化到水文模拟:CMADS如何重塑SWAT模型的中国实践

本文探讨了CMADS数据集与SWAT模型在中国复杂地形水文模拟中的融合实践。CMADS通过高分辨率气象数据同化技术,显著提升了SWAT模型在中国特殊地理环境下的模拟精度,特别是在数据稀缺区域。文章详细分析了CMADS的技术架构、应用案例及与传统数据的性能对比,为水文研究提供了新的技术支撑。

git9versioner的博客 630

linux opencl安装方法,如何在Ubuntu上安装libOpenCL.so

问题描述我下载了intel_sdk_for_opencl_2016_ubuntu_6.0.0.1049_x64,尝试运行install.sh,但是它说操作系统不受支持,因此我从某个RPM文件中读取了我需要制作.deb文件的位置,我用2做到了:opencl-1.2-devel_6.0.0.1049-2_amd64.debopencl-1.2-intel-devel_6.0.0.1049-2_amd6...

weixin_42492215的博客 3798

保姆级教程:用Ansys Workbench找出BGA焊点最容易坏的位置(附热循环+振动分析)

本文提供了一份详细的Ansys Workbench教程,指导如何通过热循环和振动分析找出BGA焊点最容易失效的位置。从模型搭建、材料定义到网格划分和载荷设置,全面解析了BGA焊点可靠性分析的全流程,帮助工程师提前预防焊点开裂问题,提升电子封装设计的可靠性。

weixin_30983965的博客 420

数字IC后端实战:Innovus与ICC2中如何巧妙规避Filler1缺失引发的DRC问题?

本文针对数字IC后端设计中工艺厂不提供最小填充单元Filler1的常见挑战,深入剖析了由此引发的DRC问题根源。详细对比了在Cadence Innovus和Synopsys ICC2两大主流PR工具中,如何通过设置单元间距约束来系统性规避物理缝隙,确保电源网络完整性与制造可靠性,为工程师提供了一套稳健的实战解决方案。

weixin_29303701的博客 306

[Ubuntu] 安装libOpenCL.so

【代码】[Ubuntu] 安装libOpenCL.so。

H_O_W_E的专栏 1382

【教程4>第8章>第44节】本章整体思维导图与学习总结

本教程系列提供FPGA/MATLAB/Simulink学习资源,包含《MATLAB入门100例》、《FPGA入门100例》、《Simulink入门60例》等基础教程,以及《FPGA/MATLAB/Simulink联合开发》进阶教程和《人工智能基础应用研究》专题,适合不同层次的学习者系统掌握相关技术。

FPGA/MATLAB学习教程/源码/项目合作开发 449

/vendor/lib64/libOpenCL.so在安卓应用中无访问权限的解决办法

转自:https://www.cnblogs.com/thisisajoke/p/12759985.html 当采用OpenCL对部分NDK代码进行加速的时候,发现运行无法调用厂商提供的libOpenCL库,原因是权限不够,以下为解决办法: 查看该库文件是否在公共库声明中,如下在adb shell中检查 adb root adb shell cd /vendor/etc cat public.libraries.txt 如果显示类似如下 libMcClient.so libMcRegis

weixin_37969624的博客 3758

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 192

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux glibc不兼容问题解决

CentOS 6 自带的 glibc 还是很老的 2.12 版本,而下载的第三方程序依赖 glibc 2.17 版本,这种情况要么自己重新编译程序,要么只能升级系统的 glibc 版本。由于我使用的程序是第三方编写并且是闭源软件无法自己编译,升级 glibc 固然可能能解决问题,但是 glibc 做为最核心的基础库,在生产环境上直接升级毕竟动作还是太大,因此希望还是能有更好的解决途径。看过这里就基本明白了,第三方程序的开发者是在自带新版本 glibc 的 Linux 系统上编译的,

yygr的博客 5522

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android 引入OpenCL详细步骤

鉴于为了演示搭建环境时遇到的坑和解决方法,本文写的非常长。 提升native代码执行效率的方法主要有算法优化,比如for循环展开;neon汇编优化,可以显著提升cpu的效率;另外就是将native代码运行在GPU侧,因为cpu上面跑的任务太多,主线程经常被其他APP抢占,而使用GPU的APP不是很多,所以可以将任务跑在GPU上,OpenCL对GPU硬件有要求,有的GPU支持OpenCL,有的则不支持。华为,荣耀很多手机都支持OpenCL。 另外,本人今天发现opencv的SDK中也有OpenCL的头文件。

hugang的博客 6736

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android studio 使用opencl库(realme 手机)

opencl.

cbzhunian 5324

Android JNI加载 Linux动态库

作为Android开发者而言,提及“.so”文件就会想到Android NDK技术,其实它也是Linux下的动态链接库。刚开始接到项目时,就丢了一份so库和test.c文件,也是摸不着头脑。知道上网查了dlopen,才明白是属于linux下的动态链接库。本文只介绍其使用方法和调试过程中遇到的问题,至于linux下的动态链接库与NDK的so库有什么区别,看这两位大神的博客就清楚了: Linux静态...

aa425705261的博客 736

OpenCL浅析(1)-GPU和FPGA平台搭建

OpenCL简介OpenCL是有Khronos Group组织发布的针对异构设备进行并行化计算的一套开源的API以及程序语言。介绍了CPU和GPU,以及FPGA的区别,然后介绍OpenCL底层的调用机制,最后介绍GPU和FPGA平台的搭建。

愿戎马一生,归来仍少年 1万+

Android JNI中使用了libOpenCL.so,依赖libGLES_mali.so,但是link时出错

我在JNI项目中使用到了OpenCL并行计算,对项目中的亿级别的for循环计算,进行优化。 本身在PC上Debug时需要运行260s,在Android上需要运行13s的计算过程,在Android上使用OpenCL后,可以将计算耗时提升到20ms,提升了几百倍的速度,运行效率达到了可以让项目落地实施的程度。 使用的libOpenCL.so是Android系统中自带的,一般在目录system/vendor/lib64下。 使用OpenCL库,还需要一些其他的库,基本上都在上述目录下。如果没有,可以看.

GreenArrowMan-优快云博客 5585

/usr/bin/ld cannot find lopencl的解决方案

使用make命令时发现报错: “ld cannot find lOpenCL" ,详细信息如下所示。的共享库文件,但是在默认情况下,它无法在共享库搜索路径中找到该文件。这些默认搜索路径包括。,那么该变量中列出的目录也将成为搜索路径。,那么它实际上是在寻找名为。来实现这一目的,或者编辑。或者,可以使用环境变量。找到之后便可以安装了。

Christina 2414

关于Android N不能加载.so库的相关问题分析

分析android不能 load 系统功能so库的问题及解决

忧愁的awe的博客 2125

dlopen()实现三方库的动态加载

目录一、函数介绍 二、实现热更新动态加载也就是运行时加载,即可以在程序运行时由我们决定何时加载指定的模块。这样进程启动时只加载必要的模块就行,减少了内存占用,除此之外最大的优点是,可以实现在不重启程序的情况下,实现模块的重新加载。这种技术也叫做“热更新”。先看一下函数原型和功能: 简单的例子实现一下dlopen的动态加载功能:libcaculator.so动态库的主要方法如下: 编译打包命令:然后在demo.cc中使用dlopen打开动态库并调用相关函数 编译命令:需要链接dl库编译报错: 用n

木牛的博客 7706

c++ dlopen demo

dlopen 使用demo,可在msys2下编译

一朵花开的时间 703
上一篇: Instant Run导致的java.lang.ClassNotFoundException错误
下一篇: Android N加载系统私有库时出现is not accessible for the namespace错误和针对该错误的解决方法
wujushan
博客等级 码龄11年 51粉丝 36原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值