2011-10-03 4 views
6

Sto provando a utilizzare Java Opencl all'interno di jruby, ma sto riscontrando un problema che non riesco a risolvere, anche con molte ricerche su google.Problemi nell'utilizzo della classe java all'interno di jruby

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) 

quando si esegue questo codice utilizzando: test.rb JRuby ottengo il seguente errore, quando l'ultima riga sia commentata:

#<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 

Chiedo solo se qualcuno ha un'idea su come risolvere questo problema?

EDIT: ok così credo di aver risolto la prima parte di questo problema facendo una serie di piattaforme:

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

ma che hanno portato a questo errore quando si aggiunge il prossimo paio di righe:

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' 

per qualche ragione quando si stampa la classe di piattaforme [0] è elencato come NilClass !?

risposta

1

Stai trascurando un errore molto semplice. Si scrive

platforms = org.jocl.cl_platform_id.new 

ma quella linea crea una singola istanza della classe org.jocl.cl_platform_id. È quindi passa che come secondo parametro org.jocl.CL.clGetPlatformIDs in

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

e che non funziona, perché il secondo argomento del metodo richiede un (vuoto) matrice di org.jocl.cl_platform_id oggetti.

quello che dice l'errore è: "Ho qualcosa che è un proxy per un oggetto Java e non riesco a trasformarlo in un una matrice di org.jocl.cl_platform_id oggetti, come tu mi stai chiedendo di fare

Se. basta dire

platforms = [] 

e passa che, potrebbe solo lavoro :).

Problemi correlati