Как вызвать Java API из Ruby 1.8 или 1.9 - PullRequest
3 голосов
/ 02 сентября 2011

У меня есть JRuby рабочий код (украденный из Keith's Blog ), который содержит API процессора SAXON xslt.

Теперь мне интересно, могу ли я и как можно обернуть тот же API в Ruby Framework?

Пожалуйстаскажите мне, если этот вопрос не имеет смысла или его можно каким-то образом улучшить.

Это ссылка на документацию по Java для требуемого API .

И этокод JRuby, который я использую:

require 'java'
module JXslt
  include_class "javax.xml.transform.TransformerFactory"
  include_class "javax.xml.transform.Transformer"
  include_class "javax.xml.transform.stream.StreamSource"
  include_class "javax.xml.transform.stream.StreamResult"
  include_class "java.lang.System"

  class XsltProcessor
    def transform(xslt,infile,outfile)
      transformer = @tf.newTransformer(StreamSource.new(xslt))
      transformer.transform(StreamSource.new(infile), StreamResult.new(outfile))
    end
  end # XsltProcessor
  class Saxon < XsltProcessor
    TRANSFORMER_FACTORY_IMPL = "net.sf.saxon.TransformerFactoryImpl"
    def initialize
      System.setProperty("javax.xml.transform.TransformerFactory", TRANSFORMER_FACTORY_IMPL)
      @tf = TransformerFactory.newInstance
    end
  end
end 

1 Ответ

6 голосов
/ 05 сентября 2011

Как отмечалось выше, вы не можете сделать это напрямую из среды выполнения Ruby, для вызова Java из Ruby требуется, чтобы вы были либо на JRuby, либо косвенно вызывали Java с помощью API C / C ++ JVM, который позволяет вам вызывать код Java из C.

Первый вариант, возможно, использует Ruby Java Bridge , который выполняет большую часть тяжелой работы за вас (он работает как оболочка Ruby-to-C-Java).

Если RJB не работает для вас, вы также можете создать свою обертку напрямую, используя JVM API в C ( пример здесь ), а затем вы можете вызвать ее из Ruby с помощью FFI .

Но если вам действительно не нужно использовать C-Ruby (MRI), я настоятельно рекомендую вам избегать любого из вышеперечисленных подходов и просто использовать JRuby, поскольку копание в собственном коде приведет к возможным ошибкам сегментапроблемы управления памятью и все вышеперечисленные параметры вынуждают вас работать в одном потоке, в то время как вы можете создать многопоточное решение с помощью JRuby.

...