2011-10-03 31 views
6

Tôi đang cố gắng sử dụng Java Opencl từ bên trong jruby, nhưng tôi đang gặp phải sự cố mà tôi không thể giải quyết, thậm chí với nhiều tìm kiếm trên google.Sự cố khi sử dụng lớp java trong 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) 

khi tôi chạy mã này sử dụng: JRuby test.rb tôi nhận được lỗi sau, khi dòng cuối cùng là không chú thích:

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

Chỉ cần tự hỏi liệu có ai có một ý tưởng về cách giải quyết vấn đề này?

EDIT: ok vì vậy tôi nghĩ rằng tôi đã giải quyết được phần đầu tiên của vấn đề này bằng cách làm cho các nền tảng một mảng:

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

nhưng điều đó dẫn đến lỗi này khi thêm vài dòng:

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' 

vì một lý do khi tôi in các lớp của các nền tảng [0] nó được liệt kê như NilClass !?

Trả lời

1

Bạn đang xem một lỗi rất đơn giản. Bạn viết

platforms = org.jocl.cl_platform_id.new 

nhưng dòng đó tạo ra một trường hợp duy nhất của lớp org.jocl.cl_platform_id. Sau đó bạn vượt qua điều đó như tham số thứ hai để org.jocl.CL.clGetPlatformIDs trong

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

và điều đó không làm việc, bởi vì đối số thứ hai của phương pháp này đòi hỏi phải có một (trống) mảng của org.jocl.cl_platform_id đối tượng.

gì lỗi nói là: "Tôi có cái gì đó là một proxy cho một đối tượng Java và tôi không thể biến nó thành một một mảng của org.jocl.cl_platform_id đối tượng, như bạn đang yêu cầu tôi làm

Nếu. bạn chỉ cần nói

platforms = [] 

và vượt qua rằng trong, nó chỉ có thể làm việc :).

Các vấn đề liên quan