2011-10-03 66 views
6

我試圖在jruby中使用Java Opencl,但遇到了一個我無法解決的問題,即使使用了大量的谷歌搜索。在jruby中使用java類時遇到的麻煩

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

你忽略了一個非常簡單的錯誤。您寫

platforms = org.jocl.cl_platform_id.new 

但該行創建類org.jocl.cl_platform_id的單個實例。然後,傳遞如

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

的第二個參數org.jocl.CL.clGetPlatformIDs和不工作,因爲該方法的第二個參數需要一個(空)org.jocl.cl_platform_id陣列對象的

錯誤說的是:「我有件事是爲Java對象的代理,我不能把它變成一個org.jocl.cl_platform_id對象的數組,你問我做

如果。你剛纔說

platforms = [] 

,並把它傳遞,它可能只是工作:)。