rjb 1.1.0-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +504 -0
- data/ChangeLog +270 -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 +8 -0
- data/ext/jniwrap.h +32 -0
- data/ext/jp_co_infoseek_hp_arton_rjb_RBridge.h +21 -0
- data/ext/load.c +287 -0
- data/ext/riconv.c +225 -0
- data/ext/riconv.h +24 -0
- data/ext/rjb.c +2807 -0
- data/ext/rjb.h +142 -0
- data/ext/rjbexception.c +135 -0
- data/lib/rjb.rb +22 -0
- data/lib/rjbcore.so +0 -0
- data/readme.sj +27 -0
- data/readme.txt +28 -0
- data/samples/filechooser.rb +46 -0
- data/test/gctest.rb +24 -0
- data/test/jp/co/infoseek/hp/arton/rjb/Base.class +0 -0
- data/test/jp/co/infoseek/hp/arton/rjb/ExtBase.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/test.rb +570 -0
- metadata +80 -0
data/ChangeLog
ADDED
@@ -0,0 +1,270 @@
|
|
1
|
+
Tue Dec 27 Kuwashima
|
2
|
+
*test/Test.java
|
3
|
+
*test/test.rb
|
4
|
+
*ext/depend
|
5
|
+
*ext/load.c
|
6
|
+
*ext/extconf.rb
|
7
|
+
*ext/rjbexception.c
|
8
|
+
*ext/rjb.c
|
9
|
+
*ext/riconv.c
|
10
|
+
change for compatibility with Ruby-1.9.0
|
11
|
+
Tue Nov 20 arton
|
12
|
+
*rjb.c
|
13
|
+
mark version 1.10.12 for next relase.
|
14
|
+
*load.c
|
15
|
+
omit useless double-quotations from JAVA_HOME, maybe specifies a longpathname (but useless).
|
16
|
+
Wed Nov 14 Kuwashima
|
17
|
+
*rjb.c
|
18
|
+
add error check to constructor.
|
19
|
+
Fri Nov 9 arton
|
20
|
+
*test.rb
|
21
|
+
*Test.java
|
22
|
+
add test for reproducing rjb-bugs-15430
|
23
|
+
*rjb.c
|
24
|
+
fix rjb-bugs-15430 that caused by bad array conversion.
|
25
|
+
(generics method result signature is an object, but the real result is typed array)
|
26
|
+
*riconv.c
|
27
|
+
correct to get the number of array element.
|
28
|
+
Tue Oct 23 Kuwashima
|
29
|
+
*riconv.c
|
30
|
+
Change string encoding conversion rule.
|
31
|
+
Mon Oct 22 Kuwashima
|
32
|
+
*riconv.c
|
33
|
+
*riconv.h
|
34
|
+
recycle iconv instance.
|
35
|
+
*test/test.rb
|
36
|
+
add cases for test_kjconv
|
37
|
+
Sun Sep 23 arton
|
38
|
+
*rjb.c
|
39
|
+
version 1.0.9
|
40
|
+
convert to Ruby's type if Rjb::primitive_converion is enalbed and the result type is java.lang.Object
|
41
|
+
support the object conversion for a bignum to long.
|
42
|
+
Sat Sep 15 arton
|
43
|
+
*rjb.c
|
44
|
+
version 1.0.8
|
45
|
+
correction of 1.0.7, support long type.
|
46
|
+
Fri Sep 14 arton
|
47
|
+
*rjb.c
|
48
|
+
version 1.0.7
|
49
|
+
add auto primitive conversion toggled by Rjb::primitive_conversion
|
50
|
+
*test.rb
|
51
|
+
add test_auto_conv
|
52
|
+
Sun Jun 17 arton
|
53
|
+
*rjb.c
|
54
|
+
add method aliases.
|
55
|
+
setXxYy -> xx_yy=
|
56
|
+
getXxYy -> xx_yy
|
57
|
+
isXxYy -> xx_yy?
|
58
|
+
xxYyZz -> xx_yy_zz
|
59
|
+
*test.rb
|
60
|
+
add a test for the method alias feature.
|
61
|
+
Tue Nov 21 arton
|
62
|
+
*rjb.c
|
63
|
+
Skip the constant registering process, if the constant was already defined.
|
64
|
+
*load.c
|
65
|
+
*rjb.c
|
66
|
+
*rjbexception.c
|
67
|
+
*rjb.h
|
68
|
+
add prefix 'rjb' for externed symbol names to avoid confliction.
|
69
|
+
|
70
|
+
Sun Oct 08 arton (on behalf of richard apodaca)
|
71
|
+
*load.c
|
72
|
+
support AMD64
|
73
|
+
|
74
|
+
Mon Sep 11 arton
|
75
|
+
*test.rb
|
76
|
+
add a test of arguments types are various array.
|
77
|
+
*Test.java
|
78
|
+
add a test of arguments types are various array.
|
79
|
+
*rjb.c
|
80
|
+
accept nil for array parameter.
|
81
|
+
Sun Sep 10 arton
|
82
|
+
*test.rb
|
83
|
+
add a test of return type is an object wrapped an array
|
84
|
+
*Test.java
|
85
|
+
add a method that returns an object wrapped an array
|
86
|
+
*rjb.c
|
87
|
+
check array-mark in jv2rv for returned object was an array
|
88
|
+
Tue Aug 1 arton
|
89
|
+
*load.c
|
90
|
+
*rjb.c
|
91
|
+
change load pathname of the bridge class.
|
92
|
+
*post-install.rb
|
93
|
+
add for remove previous installed rjb.so.
|
94
|
+
*rjb.rake
|
95
|
+
add for build Gem.
|
96
|
+
*rjb.rb
|
97
|
+
for preparing the pathname constant of the bridge class.
|
98
|
+
*depend
|
99
|
+
chage binary name from rjb.so to rjbcore.so
|
100
|
+
*extconf.rb
|
101
|
+
chage binary name from rjb.so to rjbcore.so
|
102
|
+
|
103
|
+
Mon Jul 31 arton
|
104
|
+
*load.c
|
105
|
+
fix buffer allocation
|
106
|
+
|
107
|
+
Sun Jul 16 (Jun 22) Kuwashima and arton
|
108
|
+
*rjb.c
|
109
|
+
version 0.2.8
|
110
|
+
*MANIFEST
|
111
|
+
*depend
|
112
|
+
*load.c
|
113
|
+
*rjbexception.c
|
114
|
+
change jni.h to jniwrap.h.
|
115
|
+
change the bridge class's header according to JDK 5.0's javah.
|
116
|
+
*jniwrap.h
|
117
|
+
wrap jni.h for Cygin
|
118
|
+
|
119
|
+
Sat Jun 10 14:10:05 2006 arton
|
120
|
+
*rjb.c
|
121
|
+
version 0.2.7
|
122
|
+
support an array of arrays from ruby to java.
|
123
|
+
|
124
|
+
Mon May 8 08:52:12 2006 arton
|
125
|
+
*load.c
|
126
|
+
revision 5
|
127
|
+
support both Intel and PPC Mac.
|
128
|
+
Patched version was contributed by Demetrius Nunes.
|
129
|
+
|
130
|
+
Wed Apr 12 03:57:12 2006 arton
|
131
|
+
*rjb.c
|
132
|
+
version 0.2.6
|
133
|
+
support an array of arrays.
|
134
|
+
*test.rb
|
135
|
+
add an array of arrays test, some tests are contributed by Darren Day.
|
136
|
+
*Test.java
|
137
|
+
add a test method that returns an array of arrays, some tests are
|
138
|
+
contributed by Darren Day.
|
139
|
+
|
140
|
+
Sat Dec 24 18:56:38 2005 arton
|
141
|
+
*rjb.c
|
142
|
+
version 0.2.5
|
143
|
+
release String, Float, Array object after method call.
|
144
|
+
*gctest.rb
|
145
|
+
add for String object gc test
|
146
|
+
|
147
|
+
Mon Sep 19 01:09:30 2005 arton
|
148
|
+
*rjb.c
|
149
|
+
version 0.2.4
|
150
|
+
use null instead of empty string when String argument is nil
|
151
|
+
omit unused local variable from jstring2val
|
152
|
+
*test.rb
|
153
|
+
add null string test (bug since utf-8 support)
|
154
|
+
|
155
|
+
Tue Jun 28 01:57:07 2005 arton
|
156
|
+
*rjb.c
|
157
|
+
version 0.2.3
|
158
|
+
convert result object to imported class if object is an instance of Class
|
159
|
+
call Class#forName if argument count is 1
|
160
|
+
*test.rb
|
161
|
+
add test_importobj contributed by Mr. Kuwashima, thanks.
|
162
|
+
|
163
|
+
Mon Jun 27 20:30:50 2005 arton
|
164
|
+
treat Class.forName as Rjb::import
|
165
|
+
*rjb.c
|
166
|
+
version 0.2.2
|
167
|
+
add method 'forName' into imported Class object
|
168
|
+
if pass imported object to JVM, extract Class object from ruby object
|
169
|
+
*test.rb
|
170
|
+
add above tests
|
171
|
+
|
172
|
+
Sat Jun 25 05:58:36 2005 arton
|
173
|
+
most bugs were reported by Mr. Micael Weller, thanks.
|
174
|
+
*rjb.c
|
175
|
+
version 0.2.1
|
176
|
+
correct derived static method search
|
177
|
+
search class methods then class's instance methods when called by class
|
178
|
+
avoid register non capitalized named constants into constants table
|
179
|
+
correct capitalized named method search
|
180
|
+
*riconv.c
|
181
|
+
never call iconv if $KCODE is nil
|
182
|
+
*load.c
|
183
|
+
using path separator ; for cygwin (by Ryugate)
|
184
|
+
|
185
|
+
Sun Apr 24 05:26:16 2005 arton
|
186
|
+
*rb.c
|
187
|
+
version 0.2.0
|
188
|
+
delete localref if globalref was created.
|
189
|
+
load can take the second argument for jvm
|
190
|
+
*load.c
|
191
|
+
load can take the second argument for jvm
|
192
|
+
|
193
|
+
Mon Jan 17 02:40:21 2005 arton
|
194
|
+
*rjb.c
|
195
|
+
add 'throw' module function.
|
196
|
+
move java exception handling functions into newly created rjbexception.c
|
197
|
+
*rjb.h
|
198
|
+
declations for rjb.c and rjbexception.c
|
199
|
+
*rjbexception.c
|
200
|
+
java exception handling functions, and 'throw' module function.
|
201
|
+
*test.rb
|
202
|
+
adding throw test.
|
203
|
+
|
204
|
+
Wed Jan 12 00:01:08 2005 Kaspar Schiess and arton
|
205
|
+
*rjb.c
|
206
|
+
correct Rjb::load parameter evaluation (classpath).
|
207
|
+
- many thanks to Mr.Schiess.
|
208
|
+
|
209
|
+
Sun Nov 21 02:51:43 2004 Kuwashima and arton
|
210
|
+
*rjb.c
|
211
|
+
move dbcs-utf-8 auto conversion feature into riconv.?
|
212
|
+
remove JNI version argument from Rjb::load. (bug reported by Mr.Tateishi)
|
213
|
+
*load.c
|
214
|
+
correct CLASSPATH setting (bad environment name).(bug reported by Mr.Tateishi)
|
215
|
+
*riconv.c riconv.h (contributed by Mr.Kuwashima)
|
216
|
+
DBCS - utf-8 auto conversion functions.
|
217
|
+
*depend MANIFEST
|
218
|
+
add riconv.?
|
219
|
+
- many tanks to Mr.Kuwashima and Mr.Tateishi.
|
220
|
+
|
221
|
+
Tue Oct 5 23:08:59 2004 Kuwashima and arton
|
222
|
+
*test.rb
|
223
|
+
add kanji conversion test
|
224
|
+
*rjb.c
|
225
|
+
add dbcs(sjis and euc-jp) - utf-8 auto conversion feature.
|
226
|
+
the patch was contributed by Mr.Kuwashima, many thanks.
|
227
|
+
|
228
|
+
Sun Oct 3 18:24:42 2004 arton
|
229
|
+
*load.c
|
230
|
+
JNIEnv* now using local variable instead of global one.
|
231
|
+
Because AWT event use a worker thread, and JNI need thread's owned JNIEnv.
|
232
|
+
*rjb.c
|
233
|
+
JNIEnv* now using local variable instead of global one.
|
234
|
+
Because AWT event use a worker thread, and JNI need thread's owned JNIEnv.
|
235
|
+
This change was suggested by Mr.Kuwashima, he also tested the behavior,
|
236
|
+
and gave me some test codes.
|
237
|
+
and attach_current_thread is from Mr.Kuwashima's patch.
|
238
|
+
Many thanks to Mr.Kuwashima.
|
239
|
+
|
240
|
+
Sat Sep 25 03:25:45 2004 arton
|
241
|
+
*rjb.c
|
242
|
+
implements interface's method argument conversion.
|
243
|
+
*test.rb
|
244
|
+
add Comparable test (interface with method arguments)
|
245
|
+
*Test.java
|
246
|
+
add Comparable test method.
|
247
|
+
|
248
|
+
Wed Sep 22 02:30:15 2004 arton
|
249
|
+
*rjb.c
|
250
|
+
correct constants load, using mid-class.
|
251
|
+
convert null string to nil
|
252
|
+
|
253
|
+
Wed Sep 22 00:05:32 2004 arton
|
254
|
+
*rjb.c
|
255
|
+
correct ruby type checking. If the parameter type is java.lang.String, rjb instance is always accepted.
|
256
|
+
|
257
|
+
Mon Sep 20 22:02:53 2004 arton
|
258
|
+
*rjb.c
|
259
|
+
checking method/constructor signature with class when the argument is rjb's instance.
|
260
|
+
Sun Sep 19 00:54:35 2004 arton
|
261
|
+
*rjb.c
|
262
|
+
convert Java exception to Ruby's StandardError derived class.
|
263
|
+
checking method/constructor signature when invoking if no signatur argument is supplied.
|
264
|
+
adding field accessor.
|
265
|
+
|
266
|
+
Sun Sep 12 21:42:00 2004 arton
|
267
|
+
*rjb.c
|
268
|
+
call exception description when verbose = true.
|
269
|
+
correct recursive import call (for Boolean).
|
270
|
+
corrent method not found message creation.
|
Binary file
|
data/ext/RBridge.java
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
/*
|
2
|
+
* Rjb - Ruby <-> Java Bridge
|
3
|
+
* Copyright(c) 2004 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: RBridge.java 2 2006-04-11 19:04:40Z arton $
|
16
|
+
* $Log: RBridge.java,v $
|
17
|
+
* Revision 1.2 2004/06/19 09:05:00 arton
|
18
|
+
* delete debug lines
|
19
|
+
*
|
20
|
+
* Revision 1.1 2004/06/19 09:00:19 arton
|
21
|
+
* Initial revision
|
22
|
+
*
|
23
|
+
*/
|
24
|
+
package jp.co.infoseek.hp.arton.rjb;
|
25
|
+
import java.lang.reflect.InvocationHandler;
|
26
|
+
import java.lang.reflect.Method;
|
27
|
+
import java.lang.reflect.Proxy;
|
28
|
+
|
29
|
+
public class RBridge implements InvocationHandler {
|
30
|
+
public Object register(Class itf) {
|
31
|
+
return Proxy.newProxyInstance(itf.getClassLoader(),
|
32
|
+
new Class[] { itf }, this);
|
33
|
+
}
|
34
|
+
public Object invoke(Object proxy, Method method, Object[] args)
|
35
|
+
throws Throwable {
|
36
|
+
return call(method.getName(), proxy, args);
|
37
|
+
}
|
38
|
+
private native Object call(String methodName, Object target, Object[] args);
|
39
|
+
}
|
data/ext/depend
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
riconv.o : riconv.c jp_co_infoseek_hp_arton_rjb_RBridge.h
|
2
|
+
rjb.o : rjb.c jp_co_infoseek_hp_arton_rjb_RBridge.h riconv.h rjb.h
|
3
|
+
rjbexception.o : rjbexception.c jp_co_infoseek_hp_arton_rjb_RBridge.h riconv.h rjb.h
|
4
|
+
load.o : load.c jp_co_infoseek_hp_arton_rjb_RBridge.h
|
5
|
+
jp_co_infoseek_hp_arton_rjb_RBridge.h : jniwrap.h ../data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
|
6
|
+
javah -classpath ../data/rjb jp.co.infoseek.hp.arton.rjb.RBridge
|
7
|
+
../data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class : RBridge.java
|
8
|
+
mkdir -p ../data/rjb/jp/co/infoseek/hp/arton/rjb
|
9
|
+
javac -d ../data/rjb RBridge.java
|
10
|
+
test : rjbcore.so ../test/jp/co/infoseek/hp/arton/rjb/Test.class ../test/jp/co/infoseek/hp/arton/rjb/IBase.class ../test/jp/co/infoseek/hp/arton/rjb/Base.class ../test/jp/co/infoseek/hp/arton/rjb/ExtBase.class
|
11
|
+
ruby ../test/test.rb
|
12
|
+
../test/jp/co/infoseek/hp/arton/rjb/Test.class : ../test/Test.java
|
13
|
+
javac ../test/Test.java
|
14
|
+
$(RUBY) -r fileutils -e 'FileUtils.mkdir_p "../test/jp/co/infoseek/hp/arton/rjb";FileUtils.mv("../test/Test.class", "../test/jp/co/infoseek/hp/arton/rjb")'
|
15
|
+
../test/jp/co/infoseek/hp/arton/rjb/IBase.class : ../test/IBase.java
|
16
|
+
javac ../test/IBase.java
|
17
|
+
$(RUBY) -r fileutils -e 'FileUtils.mkdir_p "../test/jp/co/infoseek/hp/arton/rjb";FileUtils.mv("../test/IBase.class", "../test/jp/co/infoseek/hp/arton/rjb")'
|
18
|
+
../test/jp/co/infoseek/hp/arton/rjb/Base.class : ../test/Base.java ../test/jp/co/infoseek/hp/arton/rjb/IBase.class
|
19
|
+
javac -classpath ../test ../test/Base.java
|
20
|
+
$(RUBY) -r fileutils -e 'FileUtils.mkdir_p "../test/jp/co/infoseek/hp/arton/rjb";FileUtils.mv("../test/Base.class", "../test/jp/co/infoseek/hp/arton/rjb")'
|
21
|
+
../test/jp/co/infoseek/hp/arton/rjb/ExtBase.class : ../test/ExtBase.java
|
22
|
+
javac -classpath ../test ../test/ExtBase.java
|
23
|
+
$(RUBY) -r fileutils -e 'FileUtils.mkdir_p "../test/jp/co/infoseek/hp/arton/rjb";FileUtils.mv("../test/ExtBase.class", "../test/jp/co/infoseek/hp/arton/rjb")'
|
data/ext/extconf.h
ADDED
data/ext/jniwrap.h
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
* Rjb - Ruby <-> Java Bridge
|
3
|
+
* Copyright(c) 2006 Kuwashima
|
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: jniwrap.h 4 2006-09-11 15:21:38Z arton $
|
16
|
+
*/
|
17
|
+
#ifndef _Included_jniwrap
|
18
|
+
#define _Included_jniwrap
|
19
|
+
#ifdef __cplusplus
|
20
|
+
extern "C" {
|
21
|
+
#endif
|
22
|
+
|
23
|
+
#if defined(__GNUC__) && (defined(__CYGWIN32__) || defined(__MINGW32__))
|
24
|
+
typedef long long __int64;
|
25
|
+
#endif
|
26
|
+
|
27
|
+
#include <jni.h>
|
28
|
+
|
29
|
+
#ifdef __cplusplus
|
30
|
+
}
|
31
|
+
#endif
|
32
|
+
#endif
|
@@ -0,0 +1,21 @@
|
|
1
|
+
/* DO NOT EDIT THIS FILE - it is machine generated */
|
2
|
+
#include <jni.h>
|
3
|
+
/* Header for class jp_co_infoseek_hp_arton_rjb_RBridge */
|
4
|
+
|
5
|
+
#ifndef _Included_jp_co_infoseek_hp_arton_rjb_RBridge
|
6
|
+
#define _Included_jp_co_infoseek_hp_arton_rjb_RBridge
|
7
|
+
#ifdef __cplusplus
|
8
|
+
extern "C" {
|
9
|
+
#endif
|
10
|
+
/*
|
11
|
+
* Class: jp_co_infoseek_hp_arton_rjb_RBridge
|
12
|
+
* Method: call
|
13
|
+
* Signature: (Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
|
14
|
+
*/
|
15
|
+
JNIEXPORT jobject JNICALL Java_jp_co_infoseek_hp_arton_rjb_RBridge_call
|
16
|
+
(JNIEnv *, jobject, jstring, jobject, jobjectArray);
|
17
|
+
|
18
|
+
#ifdef __cplusplus
|
19
|
+
}
|
20
|
+
#endif
|
21
|
+
#endif
|
data/ext/load.c
ADDED
@@ -0,0 +1,287 @@
|
|
1
|
+
/*
|
2
|
+
* Rjb - Ruby <-> Java Bridge
|
3
|
+
* Copyright(c) 2004,2005,2006 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: load.c 43 2007-12-26 18:55:04Z kuwa1 $
|
16
|
+
*/
|
17
|
+
|
18
|
+
#include <stdlib.h>
|
19
|
+
#include <stdio.h>
|
20
|
+
#include "ruby.h"
|
21
|
+
#include "extconf.h"
|
22
|
+
#if RJB_RUBY_VERSION_CODE < 190
|
23
|
+
#include "intern.h"
|
24
|
+
#include "st.h"
|
25
|
+
#include "util.h"
|
26
|
+
#else
|
27
|
+
#include "ruby/intern.h"
|
28
|
+
#include "ruby/st.h"
|
29
|
+
#include "ruby/util.h"
|
30
|
+
#endif
|
31
|
+
#include "jniwrap.h"
|
32
|
+
#include "jp_co_infoseek_hp_arton_rjb_RBridge.h"
|
33
|
+
#include "rjb.h"
|
34
|
+
|
35
|
+
#define JVM_TYPE "client"
|
36
|
+
|
37
|
+
#if defined(_WIN32) || defined(__CYGWIN__)
|
38
|
+
#if defined(__CYGWIN__)
|
39
|
+
#define JVMDLL "%s/jre/bin/%s/jvm.dll"
|
40
|
+
#define DIRSEPARATOR '/'
|
41
|
+
#else
|
42
|
+
#define JVMDLL "%s\\jre\\bin\\%s\\jvm.dll"
|
43
|
+
#define DIRSEPARATOR '\\'
|
44
|
+
#endif
|
45
|
+
#define CLASSPATH_SEP ';'
|
46
|
+
#elif defined(__APPLE__) && defined(__MACH__)
|
47
|
+
#define JVMDLL "%s/Libraries/libjvm_compat.dylib"
|
48
|
+
#define DIRSEPARATOR '/'
|
49
|
+
#define CLASSPATH_SEP ':'
|
50
|
+
#else /* defined(_WIN32) || defined(__CYGWIN__) */
|
51
|
+
#if defined(__sparc_v9__)
|
52
|
+
#define ARCH "sparcv9"
|
53
|
+
#elif defined(__sparc__)
|
54
|
+
#define ARCH "sparc"
|
55
|
+
#elif defined(__amd64__)
|
56
|
+
#define ARCH "amd64"
|
57
|
+
#undef JVM_TYPE
|
58
|
+
#define JVM_TYPE "server"
|
59
|
+
#elif defined(i586) || defined(__i386__)
|
60
|
+
#define ARCH "i386"
|
61
|
+
#endif
|
62
|
+
#ifndef ARCH
|
63
|
+
#include <sys/systeminfo.h>
|
64
|
+
#endif
|
65
|
+
#define JVMDLL "%s/jre/lib/%s/%s/libjvm.so"
|
66
|
+
#define DIRSEPARATOR '/'
|
67
|
+
#define CLASSPATH_SEP ':'
|
68
|
+
#endif
|
69
|
+
|
70
|
+
typedef int (*GETDEFAULTJAVAVMINITARGS)(void*);
|
71
|
+
typedef int (*CREATEJAVAVM)(JavaVM**, JNIEnv**, void*);
|
72
|
+
|
73
|
+
|
74
|
+
static VALUE jvmdll = Qnil;
|
75
|
+
static VALUE getdefaultjavavminitargsfunc;
|
76
|
+
static VALUE createjavavmfunc;
|
77
|
+
|
78
|
+
/*
|
79
|
+
* not completed, only valid under some circumstances.
|
80
|
+
*/
|
81
|
+
static int load_jvm(char* jvmtype)
|
82
|
+
{
|
83
|
+
char* libpath;
|
84
|
+
char* java_home;
|
85
|
+
char* jh;
|
86
|
+
VALUE dl;
|
87
|
+
VALUE importer;
|
88
|
+
|
89
|
+
#if defined(__APPLE__) && defined(__MACH__)
|
90
|
+
jh = "/System/Library/Frameworks/JavaVM.framework";
|
91
|
+
#else
|
92
|
+
jh = getenv("JAVA_HOME");
|
93
|
+
#endif
|
94
|
+
if (!jh)
|
95
|
+
{
|
96
|
+
return 0;
|
97
|
+
}
|
98
|
+
#if defined(_WIN32)
|
99
|
+
if (*jh == '"' && *(jh + strlen(jh) - 1) == '"')
|
100
|
+
{
|
101
|
+
char* p = ALLOCA_N(char, strlen(jh) + 1);
|
102
|
+
strcpy(p, jh + 1);
|
103
|
+
*(p + strlen(p) - 1) = '\0';
|
104
|
+
jh = p;
|
105
|
+
}
|
106
|
+
#endif
|
107
|
+
java_home = ALLOCA_N(char, strlen(jh) + 1);
|
108
|
+
strcpy(java_home, jh);
|
109
|
+
if (*(java_home + strlen(jh) - 1) == DIRSEPARATOR)
|
110
|
+
{
|
111
|
+
*(java_home + strlen(jh) - 1) = '\0';
|
112
|
+
}
|
113
|
+
#if defined(_WIN32) || defined(__CYGWIN__)
|
114
|
+
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home)
|
115
|
+
+ strlen(jvmtype) + 1);
|
116
|
+
sprintf(libpath, JVMDLL, java_home, jvmtype);
|
117
|
+
#elif defined(__APPLE__) && defined(__MACH__)
|
118
|
+
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home) + 1);
|
119
|
+
sprintf(libpath, JVMDLL, java_home);
|
120
|
+
#else /* not Windows / MAC OS-X */
|
121
|
+
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home)
|
122
|
+
+ strlen(ARCH) + strlen(jvmtype) + 1);
|
123
|
+
sprintf(libpath, JVMDLL, java_home, ARCH, jvmtype);
|
124
|
+
#endif
|
125
|
+
|
126
|
+
rb_require("dl");
|
127
|
+
if (!rb_const_defined_at(rb_cObject, rb_intern("DL")))
|
128
|
+
{
|
129
|
+
rb_raise(rb_eRuntimeError, "Constants DL is not defined.");
|
130
|
+
return 0;
|
131
|
+
}
|
132
|
+
|
133
|
+
jvmdll = rb_funcall(rb_const_get(rb_cObject, rb_intern("DL")), rb_intern("dlopen"), 1, rb_str_new2(libpath));
|
134
|
+
|
135
|
+
#if RJB_RUBY_VERSION_CODE < 190
|
136
|
+
getdefaultjavavminitargsfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2("JNI_GetDefaultJavaVMInitArgs"), rb_str_new2("IP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
|
137
|
+
createjavavmfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2("JNI_CreateJavaVM"), rb_str_new2("IPPP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
|
138
|
+
#else
|
139
|
+
getdefaultjavavminitargsfunc = rb_funcall(jvmdll, rb_intern("[]"), 1, rb_str_new2("JNI_GetDefaultJavaVMInitArgs"));
|
140
|
+
createjavavmfunc = rb_funcall(jvmdll, rb_intern("[]"), 1, rb_str_new2("JNI_CreateJavaVM"));
|
141
|
+
#endif
|
142
|
+
return 1;
|
143
|
+
}
|
144
|
+
|
145
|
+
static int load_bridge(JNIEnv* jenv)
|
146
|
+
{
|
147
|
+
JNINativeMethod nmethod[1];
|
148
|
+
jbyte buff[8192];
|
149
|
+
char* bridge;
|
150
|
+
int len;
|
151
|
+
FILE* f;
|
152
|
+
jclass loader = (*jenv)->FindClass(jenv, "java/lang/ClassLoader");
|
153
|
+
jmethodID getSysLoader = (*jenv)->GetStaticMethodID(jenv, loader,
|
154
|
+
"getSystemClassLoader", "()Ljava/lang/ClassLoader;");
|
155
|
+
jobject iloader = (*jenv)->CallStaticObjectMethod(jenv, loader, getSysLoader);
|
156
|
+
VALUE v = rb_const_get_at(rb_const_get(rb_cObject, rb_intern("RjbConf")),
|
157
|
+
rb_intern("BRIDGE_FILE"));
|
158
|
+
bridge = StringValuePtr(v);
|
159
|
+
#if defined(DOSISH)
|
160
|
+
bridge = ALLOCA_N(char, strlen(bridge) + 8);
|
161
|
+
strcpy(bridge, StringValuePtr(v));
|
162
|
+
for (len = 0; bridge[len]; len++)
|
163
|
+
{
|
164
|
+
if (bridge[len] == '/')
|
165
|
+
{
|
166
|
+
bridge[len] = '\\';
|
167
|
+
}
|
168
|
+
}
|
169
|
+
#endif
|
170
|
+
f = fopen(bridge, "rb");
|
171
|
+
if (f == NULL)
|
172
|
+
{
|
173
|
+
return -1;
|
174
|
+
}
|
175
|
+
len = fread(buff, 1, sizeof(buff), f);
|
176
|
+
fclose(f);
|
177
|
+
rjb_rbridge = (*jenv)->DefineClass(jenv,
|
178
|
+
"jp/co/infoseek/hp/arton/rjb/RBridge", iloader, buff, len);
|
179
|
+
if (rjb_rbridge == NULL)
|
180
|
+
{
|
181
|
+
rjb_check_exception(jenv, 1);
|
182
|
+
}
|
183
|
+
rjb_register_bridge = (*jenv)->GetMethodID(jenv, rjb_rbridge, "register",
|
184
|
+
"(Ljava/lang/Class;)Ljava/lang/Object;");
|
185
|
+
nmethod[0].name = "call";
|
186
|
+
nmethod[0].signature = "(Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;";
|
187
|
+
nmethod[0].fnPtr = Java_jp_co_infoseek_hp_arton_rjb_RBridge_call;
|
188
|
+
(*jenv)->RegisterNatives(jenv, rjb_rbridge, nmethod, 1);
|
189
|
+
rjb_rbridge = (*jenv)->NewGlobalRef(jenv, rjb_rbridge);
|
190
|
+
return 0;
|
191
|
+
}
|
192
|
+
|
193
|
+
int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs* vm_args, char* userpath, VALUE argv)
|
194
|
+
{
|
195
|
+
static JavaVMOption soptions[] = {
|
196
|
+
#if defined(__sparc_v9__) || defined(__sparc__)
|
197
|
+
{ "-Xusealtsigs", NULL },
|
198
|
+
#elif defined(linux) || defined(__linux__)
|
199
|
+
{ "-Xrs", NULL },
|
200
|
+
#elif defined(__APPLE__) && defined(_ARCH_PPC)
|
201
|
+
{ "-Xrs", NULL },
|
202
|
+
#endif
|
203
|
+
#if defined(SHOW_JAVAGC)
|
204
|
+
{ "-verbose:gc", NULL },
|
205
|
+
#endif
|
206
|
+
{ "DUMMY", NULL }, /* for classpath count */
|
207
|
+
};
|
208
|
+
char* newpath;
|
209
|
+
VALUE ptr;
|
210
|
+
int len;
|
211
|
+
int result;
|
212
|
+
GETDEFAULTJAVAVMINITARGS initargs;
|
213
|
+
CREATEJAVAVM createjavavm;
|
214
|
+
JavaVMOption* options;
|
215
|
+
int optlen;
|
216
|
+
int i;
|
217
|
+
VALUE optval;
|
218
|
+
|
219
|
+
if (!RTEST(jvmdll))
|
220
|
+
{
|
221
|
+
if (!load_jvm(JVM_TYPE))
|
222
|
+
{
|
223
|
+
return -1;
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
if (NIL_P(getdefaultjavavminitargsfunc))
|
228
|
+
{
|
229
|
+
return -1;
|
230
|
+
}
|
231
|
+
initargs = (GETDEFAULTJAVAVMINITARGS)NUM2ULONG(getdefaultjavavminitargsfunc);
|
232
|
+
result = initargs(vm_args);
|
233
|
+
if (0 > result)
|
234
|
+
{
|
235
|
+
return result;
|
236
|
+
}
|
237
|
+
len = strlen(userpath);
|
238
|
+
if (getenv("CLASSPATH"))
|
239
|
+
{
|
240
|
+
len += strlen(getenv("CLASSPATH"));
|
241
|
+
}
|
242
|
+
newpath = ALLOCA_N(char, len + 32);
|
243
|
+
if (getenv("CLASSPATH"))
|
244
|
+
{
|
245
|
+
sprintf(newpath, "-Djava.class.path=%s%c%s",
|
246
|
+
userpath, CLASSPATH_SEP, getenv("CLASSPATH"));
|
247
|
+
}
|
248
|
+
else
|
249
|
+
{
|
250
|
+
sprintf(newpath, "-Djava.class.path=%s", userpath);
|
251
|
+
}
|
252
|
+
optlen = 0;
|
253
|
+
if (!NIL_P(argv))
|
254
|
+
{
|
255
|
+
optlen += RARRAY(argv)->len;
|
256
|
+
}
|
257
|
+
optlen += COUNTOF(soptions);
|
258
|
+
options = ALLOCA_N(JavaVMOption, optlen);
|
259
|
+
options->optionString = newpath;
|
260
|
+
options->extraInfo = NULL;
|
261
|
+
for (i = 1; i < COUNTOF(soptions); i++)
|
262
|
+
{
|
263
|
+
*(options + i) = soptions[i - 1];
|
264
|
+
}
|
265
|
+
for (; i < optlen; i++)
|
266
|
+
{
|
267
|
+
optval = rb_ary_entry(argv, i - COUNTOF(soptions));
|
268
|
+
Check_Type(optval, T_STRING);
|
269
|
+
(options + i)->optionString = StringValueCStr(optval);
|
270
|
+
(options + i)->extraInfo = NULL;
|
271
|
+
}
|
272
|
+
vm_args->nOptions = optlen;
|
273
|
+
vm_args->options = options;
|
274
|
+
vm_args->ignoreUnrecognized = JNI_TRUE;
|
275
|
+
if (NIL_P(createjavavmfunc))
|
276
|
+
{
|
277
|
+
return -1;
|
278
|
+
}
|
279
|
+
createjavavm = (CREATEJAVAVM)NUM2ULONG(createjavavmfunc);
|
280
|
+
result = createjavavm(&rjb_jvm, pjenv, vm_args);
|
281
|
+
if (!result)
|
282
|
+
{
|
283
|
+
result = load_bridge(*pjenv);
|
284
|
+
}
|
285
|
+
return result;
|
286
|
+
}
|
287
|
+
|