Проблема с использованием класса java в jruby

#java #ruby #jruby

#java #ruby #jruby

Вопрос:

Я пытаюсь использовать Java Opencl из jruby, но сталкиваюсь с проблемой, которую я не могу решить, даже при большом поиске в Google.

 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 в

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

и это не работает, потому что для второго аргумента метода требуется (пустой) массив org.jocl.cl_platform_id объектов.

В ошибке говорится следующее: «У меня есть что-то, что является прокси-сервером для объекта Java, и я не могу превратить его в массив org.jocl.cl_platform_id объектов, как вы просите меня сделать.

Если вы просто скажете

 platforms = []
  

и передайте это, это может просто сработать :).