如何从Ruby 1.8或1.9调用Java API
发布时间:2020-12-16 19:31:34  所属栏目:百科  来源:网络整理 
            导读:我有这个J Ruby工作代码(从 Keith’s Blog被盗),它包装了SAXON xslt处理器API. Now,I wonder whether I can and how can I wrap the same API in Ruby framework? 请告诉我这个问题是否无意义,或者是否可以某种方式改进. 这是想要的API的java doc参考. 这是
                
                
                
            | 
                         我有这个J 
 Ruby工作代码(从 
 Keith’s Blog被盗),它包装了SAXON xslt处理器API. 
  
  
  
 请告诉我这个问题是否无意义,或者是否可以某种方式改进. 这是想要的API的java doc参考. 这是我正在使用的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
解决方法
 如上所述,您无法直接从Ruby运行时执行此操作,从Ruby调用Java要求您使用JRuby或使用允许您从C调用Java代码的C/C++ JVM API间接调用Java. 
  
  
        第一个选项可能是使用Ruby Java Bridge来完成大部分繁重工作(它可以作为Ruby-to-C-to-Java包装器). 如果RJB不适合您,您也可以使用C(example here)中的JVM API直接构建包装器,然后可以使用FFI从Ruby调用它. 但除非你真的需要使用C-Ruby(MRI),否则我强烈建议你避免使用上述任何方法,只使用JRuby,因为钻研本机代码会导致可能的段错误,内存管理问题以及所有强制选项您可以在单个线程中运行,而您可以使用JRuby构建多线程解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
