【问题标题】:Pointer may not point to null objects java openCL指针可能不指向空对象 java openCL
【发布时间】:2016-10-24 09:45:09
【问题描述】:

我正在使用一个内核,该内核将图像作为 java 和 JOCL 的参数

input ="12.jpg";
image = createBufferedImage(input);
image = createBufferedImage(input);
DataBufferInt dataBufferSrc = (DataBufferInt)image.getRaster().getDataBuffer();
int dataSrc[] = dataBufferSrc.getData();
inputImageMem = clCreateBuffer(context, CL_MEM_READ_ONLY| CL_MEM_USE_HOST_PTR,
            dataSrc.length * Sizeof.cl_uint, Pointer.to(dataSrc), null);
clSetKernelArg(kernel, 0, Sizeof.cl_mem, Pointer.to(inputImageMem));

当我编译时,我得到了错误:

指针不能指向空对象

它在行中:

clSetKernelArg(kernel, 0, Sizeof.cl_mem, Pointer.to(inputImageMem));

可能的问题是什么?我该如何解决?

PS:createBufferedImage 是取自 JOCL 样本的函数 http://jocl.org/

【问题讨论】:

    标签: java pointers opencl jocl


    【解决方案1】:

    来自openCL clCreateBuffer documentation:

    返回一个有效的非零缓冲区对象,如果缓冲区对象创建成功,则 errcode_ret 设置为 CL_SUCCESS。 否则,它返回 NULL 值,并在 errcode_ret 中返回以下错误值之一...

    clCreateBuffer 函数的最后一个参数是一个 int 指针(您希望返回错误代码的位置)。您当前已将其设置为 null。我的猜测是 clCreateBuffer 中的某些东西失败了。我建议检查errcode_ret 的值,它将包含一个错误代码,可以帮助您解决问题。

    【讨论】:

    • 在文档中,他们说当缓冲区的值为 null 时,它会返回 NULL,并在 errcode_ret 中返回以下错误值之一:CL_INVALID_CONTEXTCL_INVALID_VALUECL_INVALID_BUFFER_SIZECL_INVALID_HOST_PTR 或.....但在我的代码中只有:'指针可能不指向空对象'有没有如何查看错误?
    • @NasimaInfo 你需要自己做:传递一个包含错误值的指针作为clCreateBuffer的最后一个参数。我不完全确定它在 java 中是如何工作的。指针是 C/C++ 的东西,java 甚至不应该使用它们。 JOCL Pointer 类似乎是某种奇怪的 hack。也许创建一个指向整数的指针对象,将它作为clCreateBuffer 的最后一个参数传递并检查它是否以某种方式等于任何错误代码......?我不是真正的 java 专家或指针专家。
    • '指针可能不指向空对象'的逻辑,因为您正在调用 Pointer.to()。而指针就是给你错误的原因。但来源在 clCreateBuffer()
    • @Kilves 是的,指针类试图模拟 C void* 指针。 CL、GL 等库的 JNI 绑定并不少见,它们大量使用void* 指针。
    • 关于错误:消息“指针可能不指向空对象”是IllegalArgumentException 的一部分,当Pointer.to(...) 的参数为null 时抛出该消息。在这种情况下,inputImageMemnull。通常,clCreatebuffer 调用不应返回 null,除非出现错误。例如,如果您在main 方法的开头设置了CL.setExceptionsEnabled(true),那么它应该在发生错误时打印消息,即使您手动检查错误代码。一个可编译的示例,显示您正在做什么会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多