1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
=begin
Copyright(c) 2006-2010,2012 arton
=end
require 'rbconfig'
begin
require 'rubinius/ffi'
module DL
extend FFI::Library
class FakeDL
def initialize(lib)
@lib = lib
end
def [](fun)
f = @lib.find_function(fun)
if f
f.to_i
else
nil
end
end
end
def self.dlopen(lib)
a = ffi_lib(lib)
if Array === a && a.size >= 1
FakeDL.new(a[0])
else
nil
end
end
end
rescue LoadError
end
module RjbConf
if /darwin/ =~ RUBY_PLATFORM
if ENV['JVM_LIB'].nil? || ENV['JVM_LIB'] == ''
if ENV['JAVA_HOME'].nil? || ENV['JAVA_HOME'] == ''
jvms = Dir.glob("#{`/usr/libexec/java_home`.strip}/**/libjvm.dylib")
else
jvms = Dir.glob("#{ENV['JAVA_HOME']}/**/libjvm.dylib")
end
if jvms.size > 0
ENV['JVM_LIB'] = jvms[0]
end
end
elsif /win32|win64/ =~ RUBY_PLATFORM
# add JRE bin directory for further DLLs
ENV['PATH'] = "#{ENV['JAVA_HOME']}\\jre\\bin;#{ENV['PATH']}"
end
dir = File.join(File.dirname(File.dirname(__FILE__)), 'data')
if File.exist?(dir)
datadir = dir
else
datadir = RbConfig::CONFIG['datadir']
end
BRIDGE_FILE = ENV['RJB_BRIDGE_FILE'] || File.join(datadir, 'rjb', 'jp', 'co', 'infoseek', 'hp',
'arton', 'rjb', 'RBridge.class')
unless File.exist?(BRIDGE_FILE)
raise 'bridge file not found'
end
end
require 'rjbcore'
module Rjb
class << self
alias original_load load
def load(*args)
unless ENV['JAVA_HOME']
ENV['JAVA_HOME'] = IO.popen(['java', '-classpath',
File.join(RbConfig::CONFIG['datadir'], 'rjb'),
'jp.co.infoseek.hp.arton.rjb.RBridge']) do |f|
File.dirname(f.read.strip)
end
end
original_load(*args)
end
end
module MODIFIER
def self.STATIC
8
end
def self.PUBLIC
1
end
end
module JMethod
def instance_method?(m)
m.modifiers & MODIFIER.STATIC == 0
end
def public_method?(m)
(m.modifiers & MODIFIER.PUBLIC) == MODIFIER.PUBLIC
end
def jmethods(org, klass, &blk)
(org + klass.getMethods.select do |m|
blk.call(m)
end.map do |m|
m.name
end).uniq
end
def format_sigs(s)
if s.size < 0
''
elsif s.size == 1
s[0]
else
"[#{s.map{|m|m.nil? ? 'void' : m}.join(', ')}]"
end
end
end
class Rjb_JavaClass
include JMethod
def public_methods(inh = true)
jmethods(super(inh), self) do |m|
!instance_method?(m) && public_method?(m)
end
end
def methods(inh = true)
jmethods(super(inh), self) do |m|
!instance_method?(m) && public_method?(m)
end
end
def java_methods
jmethods([], self) do |m|
!instance_method?(m) && public_method?(m)
end.map do |m|
"#{m}(#{format_sigs(self.static_sigs(m))})"
end
end
end
class Rjb_JavaProxy
include JMethod
def initialize_proxy
end
def public_methods(inh = true)
jmethods(super(inh), getClass) do |m|
instance_method?(m) && public_method?(m)
end
end
def methods(inh = true)
jmethods(super(inh), getClass) do |m|
instance_method?(m) && public_method?(m)
end
end
def java_methods
jmethods([], getClass) do |m|
instance_method?(m) && public_method?(m)
end.map do |m|
"#{m}(#{format_sigs(getClass.sigs(m))})"
end
end
end
class Rjb_JavaBridge
def method_missing(name, *args)
@wrapped.__send__(name, *args)
end
def respond_to?(name, inc_private = false)
@wrapped.respond_to?(name, inc_private)
end
attr_reader :wrapped
end
end
|