rjb 1.4.7-x86-mswin32-100
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +504 -0
- data/ChangeLog +646 -0
- data/data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class +0 -0
- data/ext/RBridge.java +39 -0
- data/ext/depend +23 -0
- data/ext/extconf.h +7 -0
- data/ext/jniwrap.h +34 -0
- data/ext/jp_co_infoseek_hp_arton_rjb_RBridge.h +21 -0
- data/ext/load.c +438 -0
- data/ext/riconv.c +218 -0
- data/ext/riconv.h +24 -0
- data/ext/rjb.c +3314 -0
- data/ext/rjb.h +164 -0
- data/ext/rjbexception.c +167 -0
- data/lib/rjb.rb +122 -0
- data/lib/rjbcore.so +0 -0
- data/lib/rjbextension.rb +1 -0
- data/readme.sj +27 -0
- data/readme.txt +35 -0
- data/samples/filechooser.rb +35 -0
- data/samples/unzip.rb +66 -0
- data/test/Two.class +0 -0
- data/test/TwoCaller.class +0 -0
- data/test/exttest.rb +39 -0
- data/test/gctest.rb +24 -0
- data/test/jartest.jar +0 -0
- data/test/jartest.rb +24 -0
- data/test/jartest2.jar +0 -0
- data/test/jartest2.rb +23 -0
- data/test/jartest3.rb +28 -0
- data/test/jp/co/infoseek/hp/arton/rjb/CallbackTest$Callback.class +0 -0
- data/test/jp/co/infoseek/hp/arton/rjb/CallbackTest.class +0 -0
- data/test/jp/co/infoseek/hp/arton/rjb/IBase.class +0 -0
- data/test/jp/co/infoseek/hp/arton/rjb/Test$TestTypes.class +0 -0
- data/test/jp/co/infoseek/hp/arton/rjb/Test.class +0 -0
- data/test/listtest.rb +56 -0
- data/test/osx_jvmcheck.rb +9 -0
- data/test/rjbtest.jar +0 -0
- data/test/test.rb +882 -0
- data/test/test_osxjvm.rb +23 -0
- data/test/test_osxload.rb +64 -0
- data/test/test_unload.rb +26 -0
- metadata +93 -0
data/ext/rjb.h
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
/*
|
2
|
+
* Rjb - Ruby <-> Java Bridge
|
3
|
+
* Copyright(c) 2004,2005 arton
|
4
|
+
*
|
5
|
+
* This library is free software; you can redistribute it and/or
|
6
|
+
* modify it under the terms of the GNU Lesser General Public
|
7
|
+
* License as published by the Free Software Foundation; either
|
8
|
+
* version 2.1 of the License, or (at your option) any later version.
|
9
|
+
*
|
10
|
+
* This library is distributed in the hope that it will be useful,
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
* Lesser General Public License for more details.
|
14
|
+
*
|
15
|
+
* $Id: rjb.h 180 2011-12-05 16:34:29Z arton $
|
16
|
+
* $Log: rjb.h,v $
|
17
|
+
* Revision 1.1 2005/01/16 17:36:10 arton
|
18
|
+
* Initial revision
|
19
|
+
*
|
20
|
+
*
|
21
|
+
*/
|
22
|
+
|
23
|
+
#ifndef RJB_H
|
24
|
+
#define RJB_H
|
25
|
+
|
26
|
+
#if RJB_RUBY_VERSION_CODE < 190
|
27
|
+
#if !defined(RHASH_TBL)
|
28
|
+
#define RHASH_TBL(x) RHASH((x))->tbl
|
29
|
+
#endif
|
30
|
+
#endif
|
31
|
+
|
32
|
+
#if !defined(RSTRING_LEN)
|
33
|
+
#define RSTRING_LEN(s) (RSTRING(s)->len)
|
34
|
+
#endif
|
35
|
+
#if !defined(RSTRING_PTR)
|
36
|
+
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
37
|
+
#endif
|
38
|
+
#if !defined(RARRAY_LEN)
|
39
|
+
#define RARRAY_LEN(s) (RARRAY(s)->len)
|
40
|
+
#endif
|
41
|
+
#if !defined(RARRAY_PTR)
|
42
|
+
#define RARRAY_PTR(s) (RARRAY(s)->ptr)
|
43
|
+
#endif
|
44
|
+
|
45
|
+
#if !defined(COUNTOF)
|
46
|
+
#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
|
47
|
+
#endif
|
48
|
+
|
49
|
+
#if !defined(_I64_MIN)
|
50
|
+
#define _I64_MIN (-9223372036854775807i64 - 1)
|
51
|
+
#endif
|
52
|
+
#if !defined(_I64_MAX)
|
53
|
+
#define _I64_MAX 9223372036854775807i64
|
54
|
+
#endif
|
55
|
+
|
56
|
+
#if !defined(HAVE_LONG_LONG) && defined(__LP64__)
|
57
|
+
#define HAVE_LONG_LONG 1
|
58
|
+
#endif
|
59
|
+
|
60
|
+
/* in load.c */
|
61
|
+
extern int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs*, char*, VALUE);
|
62
|
+
|
63
|
+
/* in rjb.c */
|
64
|
+
extern JavaVM* rjb_jvm;
|
65
|
+
extern jclass rjb_rbridge;
|
66
|
+
extern jmethodID rjb_register_bridge;
|
67
|
+
extern VALUE rjb_loaded_classes;
|
68
|
+
extern jmethodID rjb_class_getName;
|
69
|
+
extern jclass rjb_j_throwable;
|
70
|
+
extern jmethodID rjb_throwable_getMessage;
|
71
|
+
extern JNIEnv* rjb_attach_current_thread(void);
|
72
|
+
extern jclass rjb_find_class(JNIEnv* jenv, VALUE name);
|
73
|
+
extern void rjb_release_string(JNIEnv *jenv, jstring str, const char* chrs);
|
74
|
+
extern VALUE rjb_load_vm_default();
|
75
|
+
extern void rjb_unload_vm();
|
76
|
+
extern VALUE rjb_safe_funcall(VALUE args);
|
77
|
+
extern VALUE jv2rv(JNIEnv* jenv, jvalue val);
|
78
|
+
extern jobject get_systemloader(JNIEnv* jenv);
|
79
|
+
extern jclass rjb_find_class_by_name(JNIEnv* jenv, const char* name);
|
80
|
+
|
81
|
+
/* in rjbexception.c */
|
82
|
+
extern VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str);
|
83
|
+
extern void rjb_check_exception(JNIEnv* jenv, int t);
|
84
|
+
extern VALUE rjb_s_throw(int, VALUE*, VALUE);
|
85
|
+
|
86
|
+
/* conversion functions */
|
87
|
+
typedef void (*R2J)(JNIEnv*, VALUE, jvalue*, const char*, int);
|
88
|
+
typedef VALUE (*J2R)(JNIEnv*, jvalue);
|
89
|
+
typedef jarray (*R2JARRAY)(JNIEnv*, VALUE, const char*);
|
90
|
+
typedef void (JNICALL *RELEASEARRAY)(JNIEnv*, jobject, void*, jint);
|
91
|
+
typedef jlong (JNICALL *INVOKEAL)(JNIEnv*, jobject, jmethodID, const jvalue*);
|
92
|
+
typedef jdouble (JNICALL *INVOKEAD)(JNIEnv*, jobject, jmethodID, const jvalue*);
|
93
|
+
typedef jfloat (JNICALL *INVOKEAF)(JNIEnv*, jobject, jmethodID, const jvalue*);
|
94
|
+
typedef jboolean (JNICALL *INVOKEAZ)(JNIEnv*, jobject, jmethodID, const jvalue*);
|
95
|
+
typedef jshort (JNICALL *INVOKEAS)(JNIEnv*, jobject, jmethodID, const jvalue*);
|
96
|
+
typedef jobject (JNICALL *INVOKEA)(JNIEnv*, jobject, jmethodID, const jvalue*);
|
97
|
+
typedef VALUE (*CONV)(JNIEnv*, void*);
|
98
|
+
|
99
|
+
/*
|
100
|
+
* internal method class
|
101
|
+
*/
|
102
|
+
struct cls_constructor {
|
103
|
+
jmethodID id;
|
104
|
+
int arg_count;
|
105
|
+
R2J* arg_convert;
|
106
|
+
char* method_signature;
|
107
|
+
char result_signature;
|
108
|
+
char result_arraydepth;
|
109
|
+
};
|
110
|
+
|
111
|
+
struct cls_method {
|
112
|
+
struct cls_constructor basic;
|
113
|
+
ID name;
|
114
|
+
int static_method;
|
115
|
+
off_t method;
|
116
|
+
J2R result_convert;
|
117
|
+
/* overload only */
|
118
|
+
struct cls_method* next;
|
119
|
+
};
|
120
|
+
|
121
|
+
/*
|
122
|
+
* internal field class
|
123
|
+
*/
|
124
|
+
struct cls_field {
|
125
|
+
ID name;
|
126
|
+
jfieldID id;
|
127
|
+
char* field_signature;
|
128
|
+
char result_signature;
|
129
|
+
char result_arraydepth;
|
130
|
+
R2J arg_convert;
|
131
|
+
J2R value_convert;
|
132
|
+
int readonly;
|
133
|
+
int static_field;
|
134
|
+
};
|
135
|
+
|
136
|
+
/*
|
137
|
+
* Object instance
|
138
|
+
*/
|
139
|
+
struct jvi_data {
|
140
|
+
jclass klass; /* class */
|
141
|
+
jobject obj; /* instance */
|
142
|
+
st_table* methods;
|
143
|
+
st_table* fields;
|
144
|
+
};
|
145
|
+
|
146
|
+
/*
|
147
|
+
* Class instance
|
148
|
+
*/
|
149
|
+
struct jv_data {
|
150
|
+
struct jvi_data idata;
|
151
|
+
st_table* static_methods;
|
152
|
+
struct cls_constructor** constructors;
|
153
|
+
};
|
154
|
+
|
155
|
+
/*
|
156
|
+
* Bridge instance
|
157
|
+
*/
|
158
|
+
struct rj_bridge {
|
159
|
+
jobject bridge;
|
160
|
+
jobject proxy;
|
161
|
+
VALUE wrapped;
|
162
|
+
};
|
163
|
+
|
164
|
+
#endif
|
data/ext/rjbexception.c
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
/*
|
2
|
+
* Rjb - Ruby <-> Java Bridge
|
3
|
+
* Copyright(c) 2004,2005,2006,2010 arton
|
4
|
+
*
|
5
|
+
* This library is free software; you can redistribute it and/or
|
6
|
+
* modify it under the terms of the GNU Lesser General Public
|
7
|
+
* License as published by the Free Software Foundation; either
|
8
|
+
* version 2.1 of the License, or (at your option) any later version.
|
9
|
+
*
|
10
|
+
* This library is distributed in the hope that it will be useful,
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
* Lesser General Public License for more details.
|
14
|
+
*
|
15
|
+
* $Id: rjbexception.c 174 2011-11-09 13:47:43Z arton $
|
16
|
+
*/
|
17
|
+
|
18
|
+
#include "ruby.h"
|
19
|
+
#include "extconf.h"
|
20
|
+
#if RJB_RUBY_VERSION_CODE < 190
|
21
|
+
#include "st.h"
|
22
|
+
#else
|
23
|
+
#include "ruby/st.h"
|
24
|
+
#endif
|
25
|
+
#include "jniwrap.h"
|
26
|
+
#include "riconv.h"
|
27
|
+
#include "rjb.h"
|
28
|
+
|
29
|
+
static VALUE missing_delegate(int argc, VALUE* argv, VALUE self)
|
30
|
+
{
|
31
|
+
ID rmid = rb_to_id(argv[0]);
|
32
|
+
return rb_funcall(rb_ivar_get(self, rb_intern("@cause")), rmid, argc - 1, argv + 1);
|
33
|
+
}
|
34
|
+
|
35
|
+
static VALUE exception_to_s(VALUE self)
|
36
|
+
{
|
37
|
+
return rb_funcall(rb_ivar_get(self, rb_intern("@cause")),
|
38
|
+
rb_intern("toString"), 0);
|
39
|
+
}
|
40
|
+
|
41
|
+
/*
|
42
|
+
* handle Java exception
|
43
|
+
* At this time, the Java exception is defined without the package name.
|
44
|
+
* This design may change in future release.
|
45
|
+
*/
|
46
|
+
VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str)
|
47
|
+
{
|
48
|
+
VALUE rexp;
|
49
|
+
char* pcls;
|
50
|
+
VALUE cname;
|
51
|
+
const char* p = (*jenv)->GetStringUTFChars(jenv, str, JNI_FALSE);
|
52
|
+
char* clsname = ALLOCA_N(char, strlen(p) + 1);
|
53
|
+
strcpy(clsname, p);
|
54
|
+
rjb_release_string(jenv, str, p);
|
55
|
+
pcls = strrchr(clsname, '.');
|
56
|
+
if (pcls)
|
57
|
+
{
|
58
|
+
pcls++;
|
59
|
+
}
|
60
|
+
else
|
61
|
+
{
|
62
|
+
pcls = clsname;
|
63
|
+
}
|
64
|
+
cname = rb_str_new2(pcls);
|
65
|
+
rexp = rb_hash_aref(rjb_loaded_classes, cname);
|
66
|
+
if (rexp == Qnil)
|
67
|
+
{
|
68
|
+
rexp = rb_define_class(pcls, rb_eStandardError);
|
69
|
+
rb_define_method(rexp, "method_missing", missing_delegate, -1);
|
70
|
+
rb_define_method(rexp, "to_str", exception_to_s, 0);
|
71
|
+
#if defined(HAVE_RB_HASH_ASET) || defined(RUBINIUS)
|
72
|
+
rb_hash_aset(rjb_loaded_classes, cname, rexp);
|
73
|
+
#else
|
74
|
+
#ifdef RHASH_TBL
|
75
|
+
st_insert(RHASH_TBL(rjb_loaded_classes), cname, rexp);
|
76
|
+
#else
|
77
|
+
st_insert(RHASH(rjb_loaded_classes)->tbl, cname, rexp);
|
78
|
+
#endif
|
79
|
+
#endif
|
80
|
+
|
81
|
+
}
|
82
|
+
return rexp;
|
83
|
+
}
|
84
|
+
|
85
|
+
/*
|
86
|
+
* throw newly created exception with supplied message.
|
87
|
+
*/
|
88
|
+
VALUE rjb_s_throw(int argc, VALUE* argv, VALUE self)
|
89
|
+
{
|
90
|
+
VALUE klass;
|
91
|
+
VALUE message;
|
92
|
+
JNIEnv* jenv = NULL;
|
93
|
+
|
94
|
+
rjb_load_vm_default();
|
95
|
+
|
96
|
+
jenv = rjb_attach_current_thread();
|
97
|
+
(*jenv)->ExceptionClear(jenv);
|
98
|
+
|
99
|
+
if (rb_scan_args(argc, argv, "11", &klass, &message) == 2)
|
100
|
+
{
|
101
|
+
jclass excep = rjb_find_class(jenv, klass);
|
102
|
+
if (excep == NULL)
|
103
|
+
{
|
104
|
+
rb_raise(rb_eRuntimeError, "`%s' not found", StringValueCStr(klass));
|
105
|
+
}
|
106
|
+
(*jenv)->ThrowNew(jenv, excep, StringValueCStr(message));
|
107
|
+
}
|
108
|
+
else
|
109
|
+
{
|
110
|
+
struct jvi_data* ptr;
|
111
|
+
Data_Get_Struct(klass, struct jvi_data, ptr);
|
112
|
+
if (!(*jenv)->IsInstanceOf(jenv, ptr->obj, rjb_j_throwable))
|
113
|
+
{
|
114
|
+
rb_raise(rb_eRuntimeError, "arg1 must be a throwable");
|
115
|
+
}
|
116
|
+
else
|
117
|
+
{
|
118
|
+
(*jenv)->Throw(jenv, ptr->obj);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
return Qnil;
|
122
|
+
}
|
123
|
+
|
124
|
+
void rjb_check_exception(JNIEnv* jenv, int t)
|
125
|
+
{
|
126
|
+
jthrowable exp = (*jenv)->ExceptionOccurred(jenv);
|
127
|
+
if (exp)
|
128
|
+
{
|
129
|
+
VALUE rexp = Qnil;
|
130
|
+
if (RTEST(ruby_verbose))
|
131
|
+
{
|
132
|
+
(*jenv)->ExceptionDescribe(jenv);
|
133
|
+
}
|
134
|
+
(*jenv)->ExceptionClear(jenv);
|
135
|
+
if(1)
|
136
|
+
{
|
137
|
+
char* msg = "unknown exception";
|
138
|
+
jclass cls = (*jenv)->GetObjectClass(jenv, exp);
|
139
|
+
jstring str = (*jenv)->CallObjectMethod(jenv, exp, rjb_throwable_getMessage);
|
140
|
+
if (str)
|
141
|
+
{
|
142
|
+
const char* p = (*jenv)->GetStringUTFChars(jenv, str, JNI_FALSE);
|
143
|
+
msg = ALLOCA_N(char, strlen(p) + 1);
|
144
|
+
strcpy(msg, p);
|
145
|
+
rjb_release_string(jenv, str, p);
|
146
|
+
}
|
147
|
+
str = (*jenv)->CallObjectMethod(jenv, cls, rjb_class_getName);
|
148
|
+
if (str)
|
149
|
+
{
|
150
|
+
rexp = rjb_get_exception_class(jenv, str);
|
151
|
+
}
|
152
|
+
if (rexp == Qnil)
|
153
|
+
{
|
154
|
+
(*jenv)->DeleteLocalRef(jenv, exp);
|
155
|
+
rb_raise(rb_eRuntimeError, "%s", msg);
|
156
|
+
}
|
157
|
+
else
|
158
|
+
{
|
159
|
+
VALUE rexpi = rb_funcall(rexp, rb_intern("new"), 1, rb_str_new2(msg));
|
160
|
+
jvalue val;
|
161
|
+
val.l = exp;
|
162
|
+
rb_ivar_set(rexpi, rb_intern("@cause"), jv2rv(jenv, val));
|
163
|
+
rb_exc_raise(rexpi);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
data/lib/rjb.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright(c) 2006-2010,2012 arton
|
3
|
+
=end
|
4
|
+
|
5
|
+
require 'rbconfig'
|
6
|
+
|
7
|
+
module RjbConf
|
8
|
+
if /darwin/ =~ RUBY_PLATFORM
|
9
|
+
if ENV['JVM_LIB'].nil? || ENV['JVM_LIB'] == ''
|
10
|
+
if ENV['JAVA_HOME'].nil? || ENV['JAVA_HOME'] == ''
|
11
|
+
jvms = Dir.glob("#{`/usr/libexec/java_home`.strip}/**/libjvm.dylib")
|
12
|
+
else
|
13
|
+
jvms = Dir.glob("#{ENV['JAVA_HOME']}/**/libjvm.dylib")
|
14
|
+
end
|
15
|
+
if jvms.size > 0
|
16
|
+
ENV['JVM_LIB'] = jvms[0]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
dir = File.join(File.dirname(File.dirname(__FILE__)), 'data')
|
22
|
+
if File.exist?(dir)
|
23
|
+
datadir = dir
|
24
|
+
else
|
25
|
+
datadir = RbConfig::CONFIG['datadir']
|
26
|
+
end
|
27
|
+
BRIDGE_FILE = File.join(datadir, 'rjb', 'jp', 'co', 'infoseek', 'hp',
|
28
|
+
'arton', 'rjb', 'RBridge.class')
|
29
|
+
unless File.exist?(BRIDGE_FILE)
|
30
|
+
raise 'bridge file not found'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
require 'rjbcore'
|
35
|
+
|
36
|
+
module Rjb
|
37
|
+
module MODIFIER
|
38
|
+
def self.STATIC
|
39
|
+
8
|
40
|
+
end
|
41
|
+
def self.PUBLIC
|
42
|
+
1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
module JMethod
|
47
|
+
def instance_method?(m)
|
48
|
+
m.modifiers & MODIFIER.STATIC == 0
|
49
|
+
end
|
50
|
+
def public_method?(m)
|
51
|
+
(m.modifiers & MODIFIER.PUBLIC) == MODIFIER.PUBLIC
|
52
|
+
end
|
53
|
+
def jmethods(org, klass, &blk)
|
54
|
+
(org + klass.getMethods.select do |m|
|
55
|
+
blk.call(m)
|
56
|
+
end.map do |m|
|
57
|
+
m.name
|
58
|
+
end).uniq
|
59
|
+
end
|
60
|
+
def format_sigs(s)
|
61
|
+
if s.size < 0
|
62
|
+
''
|
63
|
+
elsif s.size == 1
|
64
|
+
s[0]
|
65
|
+
else
|
66
|
+
"[#{s.map{|m|m.nil? ? 'void' : m}.join(', ')}]"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Rjb_JavaClass
|
72
|
+
include JMethod
|
73
|
+
def public_methods(inh = true)
|
74
|
+
jmethods(super(inh), self) do |m|
|
75
|
+
!instance_method?(m) && public_method?(m)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
def methods(inh = true)
|
79
|
+
jmethods(super(inh), self) do |m|
|
80
|
+
!instance_method?(m) && public_method?(m)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
def java_methods
|
84
|
+
jmethods([], self) do |m|
|
85
|
+
!instance_method?(m) && public_method?(m)
|
86
|
+
end.map do |m|
|
87
|
+
"#{m}(#{format_sigs(self.static_sigs(m))})"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
class Rjb_JavaProxy
|
92
|
+
include JMethod
|
93
|
+
def initialize_proxy
|
94
|
+
end
|
95
|
+
def public_methods(inh = true)
|
96
|
+
jmethods(super(inh), getClass) do |m|
|
97
|
+
instance_method?(m) && public_method?(m)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
def methods(inh = true)
|
101
|
+
jmethods(super(inh), getClass) do |m|
|
102
|
+
instance_method?(m) && public_method?(m)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
def java_methods
|
106
|
+
jmethods([], getClass) do |m|
|
107
|
+
instance_method?(m) && public_method?(m)
|
108
|
+
end.map do |m|
|
109
|
+
"#{m}(#{format_sigs(getClass.sigs(m))})"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
class Rjb_JavaBridge
|
114
|
+
def method_missing(name, *args)
|
115
|
+
@wrapped.__send__(name, *args)
|
116
|
+
end
|
117
|
+
def respond_to?(name, inc_private = false)
|
118
|
+
@wrapped.respond_to?(name, inc_private)
|
119
|
+
end
|
120
|
+
attr_reader :wrapped
|
121
|
+
end
|
122
|
+
end
|