麻烦在jruby中使用java类

时间:2011-10-03 06:55:25

标签: java ruby jruby

我正在尝试使用jruby中的Java Opencl,但遇到了一个我无法解决的问题,即使有很多谷歌搜索。

require 'java'
require 'JOCL-0.1.7.jar'

platforms = org.jocl.cl_platform_id.new
puts platforms.class
org.jocl.CL.clGetPlatformIDs(1, platforms, nil)

当我使用:jruby test.rb运行此代码时 当最后一行被取消注释时,我收到以下错误:

#<Class:0x10191777e>
TypeError: cannot convert instance of class org.jruby.java.proxies.ConcreteJavaP
roxy to class [Lorg.jocl.cl_platform_id;
  LukeTest at test.rb:29
    (root) at test.rb:4

只是想知道是否有人知道如何解决这个问题?

编辑: 好的,所以我想通过使平台成为一个数组我已经解决了这个问题的第一部分:

platforms = org.jocl.cl_platform_id[1].new

但是在添加下几行时会导致此错误:

context_properties = org.jocl.cl_context_properties.new()
context_properties.addProperty(org.jocl.CL::CL_CONTEXT_PLATFORM, platforms[0])
CodegenUtils.java:98:in `human': java.lang.NullPointerException
    from CodegenUtils.java:152:in `prettyParams'
    from CallableSelector.java:462:in `argumentError'
    from CallableSelector.java:436:in `argTypesDoNotMatch'
    from RubyToJavaInvoker.java:248:in `findCallableArityTwo'
    from InstanceMethodInvoker.java:66:in `call'
    from CachingCallSite.java:332:in `cacheAndCall'
    from CachingCallSite.java:203:in `call'
    from test.rb:36:in `module__0$RUBY$LukeTest'
    from test.rb:-1:in `module__0$RUBY$LukeTest'
    from test.rb:4:in `__file__'
    from test.rb:-1:in `load'
    from Ruby.java:679:in `runScript'
    from Ruby.java:672:in `runScript'
    from Ruby.java:579:in `runNormally'
    from Ruby.java:428:in `runFromMain'
    from Main.java:278:in `doRunFromMain'
    from Main.java:198:in `internalRun'
    from Main.java:164:in `run'
    from Main.java:148:in `run'
    from Main.java:128:in `main'

出于某种原因,当我打印平台类[0]时,它被列为NilClass!?

1 个答案:

答案 0 :(得分:1)

你忽略了一个非常简单的错误。你写了

platforms = org.jocl.cl_platform_id.new

但该行创建了类org.jocl.cl_platform_id的单个实例。然后,将其作为第二个参数传递给

中的org.jocl.CL.clGetPlatformIDs
org.jocl.CL.clGetPlatformIDs(1, platforms, nil)

并且不起作用,因为该方法的第二个参数需要org.jocl.cl_platform_id个对象的(空)数组

错误说的是:“我有一些东西是Java对象的代理,我不能把它变成一个org.jocl.cl_platform_id对象的数组,正如你要我做的那样。” p>

如果你只是说

platforms = []

并传入,它可能正常工作:)。