rjb 1.2.0-x86-mswin32-60 → 1.2.1-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +18 -0
- data/ext/jp_co_infoseek_hp_arton_rjb_RBridge.h +21 -21
- data/ext/load.c +3 -3
- data/ext/riconv.c +3 -3
- data/ext/rjb.c +141 -44
- data/lib/rjb.rb +2 -1
- data/lib/rjbcore.so +0 -0
- data/test/Base.class +0 -0
- data/test/ExtBase.class +0 -0
- data/test/IBase.class +0 -0
- data/test/JTest.class +0 -0
- data/test/Test$TestTypes.class +0 -0
- data/test/Test.class +0 -0
- data/test/test.rb +52 -9
- data/test/tx.rb +52 -0
- metadata +16 -9
data/ChangeLog
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
Tue May 11 arton
|
2
|
+
*ext/rjb.c
|
3
|
+
fix duplicate method registering while no alias.
|
4
|
+
add class methods for inspecting method signatures.
|
5
|
+
add class_eval method for extending Java class
|
6
|
+
*test/test.rb
|
7
|
+
add class methods test for inspecting method signatures.
|
8
|
+
add mixin tests
|
9
|
+
Tue May 4 arton
|
10
|
+
*ext/load.c
|
11
|
+
corrected wrong function signature (BUG#28088), pointed and fixed by Romulo A. Ceccon (thanks)
|
12
|
+
*ext/rjb.c
|
13
|
+
using inheritance check while inspecting a object is RJB's instance (for extending it).
|
14
|
+
Tue Mar 16 arton
|
15
|
+
*ext/riconv.c
|
16
|
+
change locale setting "" to "C", fixed by Fabien Sartor (rjb-Bugs-27968)
|
17
|
+
*ext/rjb.c
|
18
|
+
RJB_VERSION -> 1.2.1
|
1
19
|
Sun Nov 1 arton
|
2
20
|
*ext/load.c
|
3
21
|
load jvm pointed by JVM_LIB environment variable first (suggested by Ittay Dror).
|
@@ -1,21 +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
|
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
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
13
|
* Lesser General Public License for more details.
|
14
14
|
*
|
15
|
-
* $Id: load.c
|
15
|
+
* $Id: load.c 105 2010-05-04 00:01:26Z arton $
|
16
16
|
*/
|
17
17
|
|
18
18
|
#include <stdlib.h>
|
@@ -90,8 +90,8 @@
|
|
90
90
|
#define GETDEFAULTJVMINITARGS "JNI_GetDefaultJavaVMInitArgs"
|
91
91
|
#endif
|
92
92
|
|
93
|
-
typedef int (*GETDEFAULTJAVAVMINITARGS)(void*);
|
94
|
-
typedef int (*CREATEJAVAVM)(JavaVM**, JNIEnv**, void*);
|
93
|
+
typedef int (JNICALL *GETDEFAULTJAVAVMINITARGS)(void*);
|
94
|
+
typedef int (JNICALL *CREATEJAVAVM)(JavaVM**, JNIEnv**, void*);
|
95
95
|
|
96
96
|
|
97
97
|
static VALUE jvmdll = Qnil;
|
data/ext/riconv.c
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
13
|
* Lesser General Public License for more details.
|
14
14
|
*
|
15
|
-
* $Id: riconv.c
|
15
|
+
* $Id: riconv.c 104 2010-03-16 12:19:18Z arton $
|
16
16
|
*/
|
17
17
|
|
18
18
|
#include "ruby.h"
|
@@ -98,14 +98,14 @@ static const char* get_charcode_name()
|
|
98
98
|
#if defined _WIN32 || defined __CYGWIN__
|
99
99
|
if (932 == GetACP()) result = CS_CP932;
|
100
100
|
#elif defined HAVE_NL_LANGINFO
|
101
|
-
setlocale(LC_ALL, ""); //initialize
|
101
|
+
setlocale(LC_ALL, "C"); //initialize
|
102
102
|
lang = nl_langinfo(CODESET);
|
103
103
|
if (find_table(lang, NL_EUC_TABLE))
|
104
104
|
result = CS_EUCJP;
|
105
105
|
else if (find_table(lang, NL_SJIS_TABLE))
|
106
106
|
result = CS_SJIS;
|
107
107
|
#elif defined HAVE_SETLOCALE
|
108
|
-
setlocale(LC_ALL, ""); //initialize
|
108
|
+
setlocale(LC_ALL, "C"); //initialize
|
109
109
|
result = get_charcode_name_by_locale(setlocale(LC_ALL, NULL));
|
110
110
|
#elif defined HAVE_GETENV
|
111
111
|
if (result = get_charcode_name_by_locale(getenv("LC_ALL")))
|
data/ext/rjb.c
CHANGED
@@ -12,10 +12,10 @@
|
|
12
12
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
13
|
* Lesser General Public License for more details.
|
14
14
|
*
|
15
|
-
* $Id: rjb.c
|
15
|
+
* $Id: rjb.c 109 2010-05-11 13:04:25Z arton $
|
16
16
|
*/
|
17
17
|
|
18
|
-
#define RJB_VERSION "1.2.
|
18
|
+
#define RJB_VERSION "1.2.1"
|
19
19
|
|
20
20
|
#include "ruby.h"
|
21
21
|
#include "extconf.h"
|
@@ -55,10 +55,12 @@
|
|
55
55
|
#define RJB_LOAD_STATIC_METHOD(var, obj, name, sig) \
|
56
56
|
var = (*jenv)->GetStaticMethodID(jenv, obj, name, sig); \
|
57
57
|
rjb_check_exception(jenv, 1)
|
58
|
+
#define IS_RJB_OBJECT(v) (rb_class_inherited(rjbi, RBASIC(v)->klass) || RBASIC(v)->klass == rjb)
|
59
|
+
#define USER_INITIALIZE "@user_initialize"
|
58
60
|
|
59
61
|
static void register_class(VALUE, VALUE);
|
60
62
|
static VALUE import_class(JNIEnv* jenv, jclass, VALUE);
|
61
|
-
static VALUE register_instance(JNIEnv* jenv, struct
|
63
|
+
static VALUE register_instance(JNIEnv* jenv, VALUE klass, struct jv_data*, jobject);
|
62
64
|
static VALUE rjb_s_free(struct jv_data*);
|
63
65
|
static VALUE rjb_class_forname(int argc, VALUE* argv, VALUE self);
|
64
66
|
static void setup_metadata(JNIEnv* jenv, VALUE self, struct jv_data*, VALUE classname);
|
@@ -73,6 +75,8 @@ static VALUE rjbc;
|
|
73
75
|
static VALUE rjbi;
|
74
76
|
static VALUE rjbb;
|
75
77
|
|
78
|
+
static ID user_initialize;
|
79
|
+
|
76
80
|
VALUE rjb_loaded_classes;
|
77
81
|
static VALUE proxies;
|
78
82
|
JavaVM* rjb_jvm;
|
@@ -286,7 +290,7 @@ static VALUE jv2rv_r(JNIEnv* jenv, jvalue val)
|
|
286
290
|
v = import_class(jenv, klass, clsname);
|
287
291
|
}
|
288
292
|
Data_Get_Struct(v, struct jv_data, ptr);
|
289
|
-
v = register_instance(jenv, (struct
|
293
|
+
v = register_instance(jenv, v, (struct jv_data*)ptr, val.l);
|
290
294
|
(*jenv)->DeleteLocalRef(jenv, klass);
|
291
295
|
(*jenv)->DeleteLocalRef(jenv, val.l);
|
292
296
|
return v;
|
@@ -673,8 +677,7 @@ static void rv2jstring(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
|
|
673
677
|
{
|
674
678
|
if (!release)
|
675
679
|
{
|
676
|
-
if (TYPE(val) == T_DATA
|
677
|
-
&& (RBASIC(val)->klass == rjbi || RBASIC(val)->klass == rjb))
|
680
|
+
if (TYPE(val) == T_DATA && IS_RJB_OBJECT(val))
|
678
681
|
{
|
679
682
|
struct jvi_data* ptr;
|
680
683
|
Data_Get_Struct(val, struct jvi_data, ptr);
|
@@ -710,7 +713,7 @@ static void rv2jstring(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
|
|
710
713
|
{
|
711
714
|
if (TYPE(val) == T_DATA)
|
712
715
|
{
|
713
|
-
|
716
|
+
if (IS_RJB_OBJECT(val))
|
714
717
|
{
|
715
718
|
struct jvi_data* ptr;
|
716
719
|
Data_Get_Struct(val, struct jvi_data, ptr);
|
@@ -764,9 +767,9 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
|
|
764
767
|
switch (TYPE(val))
|
765
768
|
{
|
766
769
|
case T_DATA:
|
767
|
-
|
770
|
+
if (IS_RJB_OBJECT(val))
|
768
771
|
{
|
769
|
-
|
772
|
+
/* TODO: check instanceof (class (in psig) ) */
|
770
773
|
struct jvi_data* ptr;
|
771
774
|
Data_Get_Struct(val, struct jvi_data, ptr);
|
772
775
|
jv->l = ptr->obj;
|
@@ -1327,14 +1330,16 @@ static struct cls_method* clone_methodinfo(struct cls_method* pm)
|
|
1327
1330
|
return result;
|
1328
1331
|
}
|
1329
1332
|
|
1330
|
-
static
|
1333
|
+
static int make_alias(const char* jname, char* rname)
|
1331
1334
|
{
|
1335
|
+
int ret = 0;
|
1332
1336
|
while (*jname)
|
1333
1337
|
{
|
1334
1338
|
if (isupper(*jname))
|
1335
1339
|
{
|
1336
1340
|
*rname++ = '_';
|
1337
1341
|
*rname++ = tolower(*jname++);
|
1342
|
+
ret = 1;
|
1338
1343
|
}
|
1339
1344
|
else
|
1340
1345
|
{
|
@@ -1342,6 +1347,7 @@ static void make_alias(const char* jname, char* rname)
|
|
1342
1347
|
}
|
1343
1348
|
}
|
1344
1349
|
*rname = '\0';
|
1350
|
+
return ret;
|
1345
1351
|
}
|
1346
1352
|
|
1347
1353
|
static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static_method)
|
@@ -1349,6 +1355,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
|
|
1349
1355
|
struct cls_method* result;
|
1350
1356
|
struct cls_method* pm;
|
1351
1357
|
const char* jname;
|
1358
|
+
int alias;
|
1352
1359
|
jstring nm;
|
1353
1360
|
jobjectArray parama;
|
1354
1361
|
jobject cls;
|
@@ -1365,7 +1372,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
|
|
1365
1372
|
rjb_check_exception(jenv, 0);
|
1366
1373
|
jname = (*jenv)->GetStringUTFChars(jenv, nm, NULL);
|
1367
1374
|
rname = ALLOCA_N(char, strlen(jname) * 2 + 8);
|
1368
|
-
make_alias(jname, rname);
|
1375
|
+
alias = make_alias(jname, rname);
|
1369
1376
|
result->name = rb_intern(jname);
|
1370
1377
|
rjb_release_string(jenv, nm, jname);
|
1371
1378
|
result->basic.id = (*jenv)->FromReflectedMethod(jenv, m);
|
@@ -1404,7 +1411,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
|
|
1404
1411
|
if (*rname == '_') rname++;
|
1405
1412
|
strcat(rname, "?");
|
1406
1413
|
}
|
1407
|
-
else
|
1414
|
+
else if (alias)
|
1408
1415
|
{
|
1409
1416
|
pm = clone_methodinfo(result);
|
1410
1417
|
}
|
@@ -1729,6 +1736,7 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
|
|
1729
1736
|
|
1730
1737
|
jklass = import_class(jenv, j_class, rb_str_new2("java.lang.Class"));
|
1731
1738
|
rb_define_method(RBASIC(jklass)->klass, "forName", rjb_class_forname, -1);
|
1739
|
+
rb_define_method(RBASIC(jklass)->klass, "for_name", rjb_class_forname, -1);
|
1732
1740
|
rb_gc_register_address(&jklass);
|
1733
1741
|
|
1734
1742
|
return Qnil;
|
@@ -1745,6 +1753,18 @@ VALUE rjb_load_vm_default()
|
|
1745
1753
|
return rjb_s_load(0, NULL, 0);
|
1746
1754
|
}
|
1747
1755
|
|
1756
|
+
/*
|
1757
|
+
* common prelude
|
1758
|
+
*/
|
1759
|
+
JNIEnv* rjb_prelude()
|
1760
|
+
{
|
1761
|
+
JNIEnv* jenv = NULL;
|
1762
|
+
rjb_load_vm_default();
|
1763
|
+
jenv = rjb_attach_current_thread();
|
1764
|
+
(*jenv)->ExceptionClear(jenv);
|
1765
|
+
return jenv;
|
1766
|
+
}
|
1767
|
+
|
1748
1768
|
/*
|
1749
1769
|
* unload Java Virtual Machine
|
1750
1770
|
*
|
@@ -1883,14 +1903,19 @@ static VALUE rjb_s_free(struct jv_data* ptr)
|
|
1883
1903
|
* create new instance of this class
|
1884
1904
|
*/
|
1885
1905
|
static VALUE createinstance(JNIEnv* jenv, int argc, VALUE* argv,
|
1886
|
-
|
1906
|
+
VALUE self, struct cls_constructor* pc)
|
1887
1907
|
{
|
1888
1908
|
int i;
|
1889
1909
|
char* psig = pc->method_signature;
|
1890
1910
|
jobject obj = NULL;
|
1891
1911
|
VALUE result;
|
1892
|
-
|
1912
|
+
struct jv_data* jklass;
|
1913
|
+
struct jvi_data* org;
|
1893
1914
|
jvalue* args = (argc) ? ALLOCA_N(jvalue, argc) : NULL;
|
1915
|
+
|
1916
|
+
Data_Get_Struct(self, struct jv_data, jklass);
|
1917
|
+
org = &jklass->idata;
|
1918
|
+
|
1894
1919
|
for (i = 0; i < argc; i++)
|
1895
1920
|
{
|
1896
1921
|
R2J pr2j = *(pc->arg_convert + i);
|
@@ -1911,7 +1936,7 @@ static VALUE createinstance(JNIEnv* jenv, int argc, VALUE* argv,
|
|
1911
1936
|
psig = next_sig(psig);
|
1912
1937
|
}
|
1913
1938
|
|
1914
|
-
result = register_instance(jenv,
|
1939
|
+
result = register_instance(jenv, self, jklass, obj);
|
1915
1940
|
(*jenv)->DeleteLocalRef(jenv, obj);
|
1916
1941
|
return result;
|
1917
1942
|
}
|
@@ -1941,16 +1966,29 @@ static VALUE import_class(JNIEnv* jenv, jclass jcls, VALUE clsname)
|
|
1941
1966
|
return v;
|
1942
1967
|
}
|
1943
1968
|
|
1944
|
-
static VALUE
|
1969
|
+
static VALUE rjb_i_prepare_proxy(VALUE self)
|
1970
|
+
{
|
1971
|
+
return rb_funcall(self, rb_intern("instance_eval"), 1,
|
1972
|
+
rb_str_new2("instance_eval &" USER_INITIALIZE));
|
1973
|
+
}
|
1974
|
+
|
1975
|
+
static VALUE register_instance(JNIEnv* jenv, VALUE klass, struct jv_data* org, jobject obj)
|
1945
1976
|
{
|
1946
1977
|
VALUE v;
|
1978
|
+
VALUE iproc;
|
1947
1979
|
struct jvi_data* ptr = ALLOC(struct jvi_data);
|
1948
1980
|
memset(ptr, 0, sizeof(struct jvi_data));
|
1949
1981
|
v = Data_Wrap_Struct(rjbi, NULL, rjb_delete_ref, ptr);
|
1950
|
-
ptr->klass = org->obj;
|
1982
|
+
ptr->klass = org->idata.obj;
|
1951
1983
|
ptr->obj = (*jenv)->NewGlobalRef(jenv, obj);
|
1952
|
-
ptr->methods = org->methods;
|
1953
|
-
ptr->fields = org->fields;
|
1984
|
+
ptr->methods = org->idata.methods;
|
1985
|
+
ptr->fields = org->idata.fields;
|
1986
|
+
iproc = rb_ivar_get(klass, user_initialize);
|
1987
|
+
if (iproc != Qnil)
|
1988
|
+
{
|
1989
|
+
rb_ivar_set(v, user_initialize, iproc);
|
1990
|
+
rb_funcall(v, rb_intern("_prepare_proxy"), 0, 0);
|
1991
|
+
}
|
1954
1992
|
return v;
|
1955
1993
|
}
|
1956
1994
|
|
@@ -1990,7 +2028,7 @@ static int check_rtype(JNIEnv* jenv, VALUE v, char* p)
|
|
1990
2028
|
case T_ARRAY:
|
1991
2029
|
return *p == '[';
|
1992
2030
|
case T_DATA:
|
1993
|
-
if (
|
2031
|
+
if (IS_RJB_OBJECT(v) && pcls)
|
1994
2032
|
{
|
1995
2033
|
/* imported object */
|
1996
2034
|
jclass cls;
|
@@ -2028,11 +2066,7 @@ static VALUE rjb_newinstance_s(int argc, VALUE* argv, VALUE self)
|
|
2028
2066
|
VALUE ret = Qnil;
|
2029
2067
|
struct jv_data* ptr;
|
2030
2068
|
int found = 0;
|
2031
|
-
JNIEnv* jenv =
|
2032
|
-
|
2033
|
-
rjb_load_vm_default();
|
2034
|
-
jenv = rjb_attach_current_thread();
|
2035
|
-
(*jenv)->ExceptionClear(jenv);
|
2069
|
+
JNIEnv* jenv = rjb_prelude();
|
2036
2070
|
|
2037
2071
|
rb_scan_args(argc, argv, "1*", &vsig, &rest);
|
2038
2072
|
sig = StringValueCStr(vsig);
|
@@ -2046,7 +2080,7 @@ static VALUE rjb_newinstance_s(int argc, VALUE* argv, VALUE self)
|
|
2046
2080
|
&& !strcmp(sig, (*pc)->method_signature))
|
2047
2081
|
{
|
2048
2082
|
found = 1;
|
2049
|
-
ret = createinstance(jenv, argc - 1, argv + 1,
|
2083
|
+
ret = createinstance(jenv, argc - 1, argv + 1, self, *pc);
|
2050
2084
|
break;
|
2051
2085
|
}
|
2052
2086
|
}
|
@@ -2063,12 +2097,8 @@ static VALUE rjb_newinstance(int argc, VALUE* argv, VALUE self)
|
|
2063
2097
|
struct jv_data* ptr;
|
2064
2098
|
struct cls_constructor** pc;
|
2065
2099
|
int found = 0;
|
2066
|
-
JNIEnv* jenv =
|
2100
|
+
JNIEnv* jenv = rjb_prelude();
|
2067
2101
|
|
2068
|
-
rjb_load_vm_default();
|
2069
|
-
jenv = rjb_attach_current_thread();
|
2070
|
-
(*jenv)->ExceptionClear(jenv);
|
2071
|
-
|
2072
2102
|
Data_Get_Struct(self, struct jv_data, ptr);
|
2073
2103
|
|
2074
2104
|
if (ptr->constructors)
|
@@ -2092,7 +2122,7 @@ static VALUE rjb_newinstance(int argc, VALUE* argv, VALUE self)
|
|
2092
2122
|
}
|
2093
2123
|
if (found)
|
2094
2124
|
{
|
2095
|
-
ret = createinstance(jenv, argc, argv,
|
2125
|
+
ret = createinstance(jenv, argc, argv, self, *pc);
|
2096
2126
|
break;
|
2097
2127
|
}
|
2098
2128
|
}
|
@@ -2118,18 +2148,71 @@ jclass rjb_find_class(JNIEnv* jenv, VALUE name)
|
|
2118
2148
|
return (*jenv)->FindClass(jenv, java2jniname(jnicls));
|
2119
2149
|
}
|
2120
2150
|
|
2151
|
+
/*
|
2152
|
+
* get specified method signature
|
2153
|
+
*/
|
2154
|
+
static VALUE get_signatures(VALUE mname, st_table* st)
|
2155
|
+
{
|
2156
|
+
VALUE ret;
|
2157
|
+
struct cls_method* pm;
|
2158
|
+
ID rmid = rb_to_id(mname);
|
2159
|
+
|
2160
|
+
if (!st_lookup(st, rmid, (st_data_t*)&pm))
|
2161
|
+
{
|
2162
|
+
const char* tname = rb_id2name(rmid);
|
2163
|
+
rb_raise(rb_eRuntimeError, "Fail: unknown method name `%s'", tname);
|
2164
|
+
}
|
2165
|
+
ret = rb_ary_new();
|
2166
|
+
for (; pm; pm = pm->next)
|
2167
|
+
{
|
2168
|
+
rb_ary_push(ret, rb_str_new2(pm->basic.method_signature));
|
2169
|
+
}
|
2170
|
+
return ret;
|
2171
|
+
}
|
2172
|
+
|
2173
|
+
static VALUE rjb_get_signatures(VALUE self, VALUE mname)
|
2174
|
+
{
|
2175
|
+
struct jv_data* ptr;
|
2176
|
+
|
2177
|
+
Data_Get_Struct(self, struct jv_data, ptr);
|
2178
|
+
return get_signatures(mname, ptr->idata.methods);
|
2179
|
+
}
|
2180
|
+
|
2181
|
+
static VALUE rjb_get_static_signatures(VALUE self, VALUE mname)
|
2182
|
+
{
|
2183
|
+
struct jv_data* ptr;
|
2184
|
+
|
2185
|
+
Data_Get_Struct(self, struct jv_data, ptr);
|
2186
|
+
return get_signatures(mname, ptr->static_methods);
|
2187
|
+
}
|
2188
|
+
|
2189
|
+
static VALUE rjb_get_ctor_signatures(VALUE self)
|
2190
|
+
{
|
2191
|
+
VALUE ret;
|
2192
|
+
struct jv_data* ptr;
|
2193
|
+
struct cls_constructor** pc;
|
2194
|
+
|
2195
|
+
Data_Get_Struct(self, struct jv_data, ptr);
|
2196
|
+
ret = rb_ary_new();
|
2197
|
+
if (ptr->constructors)
|
2198
|
+
{
|
2199
|
+
for (pc = ptr->constructors; *pc; pc++)
|
2200
|
+
{
|
2201
|
+
rb_ary_push(ret, rb_str_new2((*pc)->method_signature));
|
2202
|
+
}
|
2203
|
+
}
|
2204
|
+
return ret;
|
2205
|
+
}
|
2206
|
+
|
2121
2207
|
/*
|
2122
2208
|
* jclass Rjb::bind(rbobj, interface_name)
|
2123
2209
|
*/
|
2124
2210
|
static VALUE rjb_s_bind(VALUE self, VALUE rbobj, VALUE itfname)
|
2125
2211
|
{
|
2126
2212
|
VALUE result = Qnil;
|
2127
|
-
JNIEnv* jenv = NULL;
|
2128
2213
|
jclass itf;
|
2214
|
+
JNIEnv* jenv = rjb_prelude();
|
2129
2215
|
|
2130
|
-
rjb_load_vm_default();
|
2131
|
-
jenv = rjb_attach_current_thread();
|
2132
|
-
(*jenv)->ExceptionClear(jenv);
|
2133
2216
|
itf = rjb_find_class(jenv, itfname);
|
2134
2217
|
rjb_check_exception(jenv, 1);
|
2135
2218
|
if (itf)
|
@@ -2154,15 +2237,24 @@ static VALUE rjb_s_bind(VALUE self, VALUE rbobj, VALUE itfname)
|
|
2154
2237
|
return result;
|
2155
2238
|
}
|
2156
2239
|
|
2240
|
+
/*
|
2241
|
+
* Rjb's class is not Class but Object, so add class_eval for the Java class.
|
2242
|
+
*/
|
2243
|
+
static VALUE rjb_class_eval(int argc, VALUE* argv, VALUE self)
|
2244
|
+
{
|
2245
|
+
if (rb_block_given_p())
|
2246
|
+
{
|
2247
|
+
rb_ivar_set(self, user_initialize, rb_block_proc());
|
2248
|
+
}
|
2249
|
+
return self;
|
2250
|
+
}
|
2251
|
+
|
2157
2252
|
/*
|
2158
2253
|
* jclass Rjb::bind(rbobj, interface_name)
|
2159
2254
|
*/
|
2160
2255
|
static VALUE rjb_s_unbind(VALUE self, VALUE rbobj)
|
2161
2256
|
{
|
2162
|
-
JNIEnv* jenv;
|
2163
|
-
rjb_load_vm_default();
|
2164
|
-
jenv = rjb_attach_current_thread();
|
2165
|
-
(*jenv)->ExceptionClear(jenv);
|
2257
|
+
JNIEnv* jenv = rjb_prelude();
|
2166
2258
|
return rb_ary_delete(proxies, rbobj);
|
2167
2259
|
}
|
2168
2260
|
|
@@ -2179,9 +2271,7 @@ static VALUE rjb_s_import(VALUE self, VALUE clsname)
|
|
2179
2271
|
return v;
|
2180
2272
|
}
|
2181
2273
|
|
2182
|
-
|
2183
|
-
jenv = rjb_attach_current_thread();
|
2184
|
-
(*jenv)->ExceptionClear(jenv);
|
2274
|
+
jenv = rjb_prelude();
|
2185
2275
|
jcls = rjb_find_class(jenv, clsname);
|
2186
2276
|
if (!jcls)
|
2187
2277
|
{
|
@@ -2196,6 +2286,10 @@ static void register_class(VALUE self, VALUE clsname)
|
|
2196
2286
|
{
|
2197
2287
|
rb_define_singleton_method(self, "new", rjb_newinstance, -1);
|
2198
2288
|
rb_define_singleton_method(self, "new_with_sig", rjb_newinstance_s, -1);
|
2289
|
+
rb_define_singleton_method(self, "class_eval", rjb_class_eval, -1);
|
2290
|
+
rb_define_singleton_method(self, "sigs", rjb_get_signatures, 1);
|
2291
|
+
rb_define_singleton_method(self, "static_sigs", rjb_get_static_signatures, 1);
|
2292
|
+
rb_define_singleton_method(self, "ctor_sigs", rjb_get_ctor_signatures, 0);
|
2199
2293
|
/*
|
2200
2294
|
* the hash was frozen, so it need to call st_ func directly.
|
2201
2295
|
*/
|
@@ -2745,6 +2839,7 @@ void Init_rjbcore()
|
|
2745
2839
|
rb_global_variable(&rjb_loaded_classes);
|
2746
2840
|
proxies = rb_ary_new();
|
2747
2841
|
rb_global_variable(&proxies);
|
2842
|
+
user_initialize = rb_intern(USER_INITIALIZE);
|
2748
2843
|
|
2749
2844
|
rjb = rb_define_module("Rjb");
|
2750
2845
|
rb_define_module_function(rjb, "load", rjb_s_load, -1);
|
@@ -2763,7 +2858,7 @@ void Init_rjbcore()
|
|
2763
2858
|
rb_gc_register_address(&rjbc);
|
2764
2859
|
rb_define_method(rjbc, "method_missing", rjb_missing, -1);
|
2765
2860
|
rb_define_method(rjbc, "_invoke", rjb_invoke, -1);
|
2766
|
-
rb_define_method(rjbc, "_classname", rjb_i_class, 0);
|
2861
|
+
rb_define_method(rjbc, "_classname", rjb_i_class, 0);
|
2767
2862
|
|
2768
2863
|
/* Java instance object */
|
2769
2864
|
rjbi = rb_class_new(rb_cObject);
|
@@ -2771,6 +2866,8 @@ void Init_rjbcore()
|
|
2771
2866
|
rb_define_method(rjbi, "method_missing", rjb_i_missing, -1);
|
2772
2867
|
rb_define_method(rjbi, "_invoke", rjb_i_invoke, -1);
|
2773
2868
|
rb_define_method(rjbi, "_classname", rjb_i_class, 0);
|
2869
|
+
rb_define_method(rjbi, "_prepare_proxy", rjb_i_prepare_proxy, 0);
|
2870
|
+
rb_define_alias(rjbi, "include", "extend");
|
2774
2871
|
|
2775
2872
|
/* Ruby-Java Bridge object */
|
2776
2873
|
rjbb = rb_class_new(rb_cObject);
|
data/lib/rjb.rb
CHANGED
data/lib/rjbcore.so
CHANGED
Binary file
|
data/test/Base.class
ADDED
Binary file
|
data/test/ExtBase.class
ADDED
Binary file
|
data/test/IBase.class
ADDED
Binary file
|
data/test/JTest.class
ADDED
Binary file
|
Binary file
|
data/test/Test.class
ADDED
Binary file
|
data/test/test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/local/env ruby -Ku
|
2
2
|
# encoding: utf-8
|
3
|
-
# $Id: test.rb
|
3
|
+
# $Id: test.rb 109 2010-05-11 13:04:25Z arton $
|
4
4
|
|
5
5
|
begin
|
6
6
|
require 'rjb'
|
@@ -18,14 +18,14 @@ class TestRjb < Test::Unit::TestCase
|
|
18
18
|
Rjb::primitive_conversion = false
|
19
19
|
|
20
20
|
@jString = import('java.lang.String')
|
21
|
-
@jInteger =
|
22
|
-
@jShort =
|
23
|
-
@jDouble =
|
24
|
-
@jFloat =
|
25
|
-
@jBoolean =
|
26
|
-
@jByte =
|
27
|
-
@jLong =
|
28
|
-
@jChar =
|
21
|
+
@jInteger = import('java.lang.Integer')
|
22
|
+
@jShort = import('java.lang.Short')
|
23
|
+
@jDouble = import('java.lang.Double')
|
24
|
+
@jFloat = import('java.lang.Float')
|
25
|
+
@jBoolean = import('java.lang.Boolean')
|
26
|
+
@jByte = import('java.lang.Byte')
|
27
|
+
@jLong = import('java.lang.Long')
|
28
|
+
@jChar = import('java.lang.Character')
|
29
29
|
end
|
30
30
|
|
31
31
|
def teardown
|
@@ -650,5 +650,48 @@ class TestRjb < Test::Unit::TestCase
|
|
650
650
|
assert_equal "can't create Java VM", $!.message
|
651
651
|
end
|
652
652
|
end
|
653
|
+
|
654
|
+
module TestMixin
|
655
|
+
def test_hello(s)
|
656
|
+
'hello ' + s
|
657
|
+
end
|
658
|
+
end
|
659
|
+
def test_extend
|
660
|
+
@jString.class_eval do
|
661
|
+
include TestMixin
|
662
|
+
end
|
663
|
+
s = @jString.new
|
664
|
+
assert_equal('hello world', s.test_hello('world'))
|
665
|
+
end
|
666
|
+
def test_extend_with_factory
|
667
|
+
point = import('java.awt.Point')
|
668
|
+
point.class_eval do
|
669
|
+
include TestMixin
|
670
|
+
end
|
671
|
+
p = point.new(11, 12)
|
672
|
+
assert_equal(11, p.x)
|
673
|
+
assert_equal(12, p.y)
|
674
|
+
assert_equal('hello world', p.test_hello('world'))
|
675
|
+
p = p.location
|
676
|
+
assert_equal(11, p.x)
|
677
|
+
assert_equal(12, p.y)
|
678
|
+
assert_equal('hello world', p.test_hello('world'))
|
679
|
+
end
|
680
|
+
def test_fetch_method_signature
|
681
|
+
expected = ['I', 'II', 'Ljava.lang.String;', 'Ljava.lang.String;I']
|
682
|
+
sig = @jString.sigs('indexOf').sort
|
683
|
+
assert_equal(expected, sig)
|
684
|
+
end
|
685
|
+
def test_fetch_static_method_signature
|
686
|
+
expected = ['Ljava.lang.String;[Ljava.lang.Object;',
|
687
|
+
'Ljava.util.Locale;Ljava.lang.String;[Ljava.lang.Object;']
|
688
|
+
sig = @jString.static_sigs('format').sort
|
689
|
+
assert_equal(expected, sig)
|
690
|
+
end
|
691
|
+
def test_fetch_ctor_signature
|
692
|
+
expected = ['I', 'Ljava.lang.String;']
|
693
|
+
sig = @jInteger.ctor_sigs.sort
|
694
|
+
assert_equal(expected, sig)
|
695
|
+
end
|
653
696
|
end
|
654
697
|
|
data/test/tx.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/local/env ruby -Ku
|
2
|
+
# encoding: utf-8
|
3
|
+
# $Id: test.rb 87 2009-02-15 12:25:36Z arton $
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'rjb'
|
7
|
+
rescue LoadError
|
8
|
+
require 'rubygems'
|
9
|
+
require 'rjb'
|
10
|
+
end
|
11
|
+
require 'test/unit'
|
12
|
+
|
13
|
+
puts "start RJB(#{Rjb::VERSION}) test"
|
14
|
+
class TestRjb < Test::Unit::TestCase
|
15
|
+
include Rjb
|
16
|
+
def setup
|
17
|
+
Rjb::load('.')
|
18
|
+
@jString = import('java.lang.String')
|
19
|
+
@jInteger = Rjb::import('java.lang.Integer')
|
20
|
+
@jShort = Rjb::import('java.lang.Short')
|
21
|
+
@jDouble = Rjb::import('java.lang.Double')
|
22
|
+
@jFloat = Rjb::import('java.lang.Float')
|
23
|
+
@jBoolean = Rjb::import('java.lang.Boolean')
|
24
|
+
@jByte = Rjb::import('java.lang.Byte')
|
25
|
+
@jLong = Rjb::import('java.lang.Long')
|
26
|
+
@jChar = Rjb::import('java.lang.Character')
|
27
|
+
end
|
28
|
+
|
29
|
+
def teardown
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_scalar
|
33
|
+
str = @jString.new_with_sig('Ljava.lang.String;', "abcde")
|
34
|
+
p str
|
35
|
+
p str.class
|
36
|
+
# rjb object (String)
|
37
|
+
str2 = @jString.new_with_sig('Ljava.lang.String;', 'fghijk')
|
38
|
+
p str2
|
39
|
+
p str2.class
|
40
|
+
a = str.concat(str2)
|
41
|
+
p a
|
42
|
+
p a.class
|
43
|
+
p str2
|
44
|
+
p str2.class
|
45
|
+
a = str.concat(str2)
|
46
|
+
p a
|
47
|
+
p a.class
|
48
|
+
assert_equal('abcdefghijk', str.concat(str2))
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rjb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: x86-mswin32-60
|
6
6
|
authors:
|
7
7
|
- arton
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-05-11 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -26,25 +26,32 @@ extra_rdoc_files: []
|
|
26
26
|
files:
|
27
27
|
- ext/RBridge.java
|
28
28
|
- ext/load.c
|
29
|
-
- ext/rjbexception.c
|
30
29
|
- ext/riconv.c
|
31
30
|
- ext/rjb.c
|
32
|
-
- ext/
|
33
|
-
- ext/riconv.h
|
31
|
+
- ext/rjbexception.c
|
34
32
|
- ext/extconf.h
|
35
33
|
- ext/jniwrap.h
|
34
|
+
- ext/jp_co_infoseek_hp_arton_rjb_RBridge.h
|
35
|
+
- ext/riconv.h
|
36
36
|
- ext/rjb.h
|
37
37
|
- ext/depend
|
38
38
|
- data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
|
39
39
|
- lib/rjb.rb
|
40
40
|
- samples/filechooser.rb
|
41
|
-
- test/test.rb
|
42
41
|
- test/gctest.rb
|
42
|
+
- test/test.rb
|
43
|
+
- test/tx.rb
|
44
|
+
- test/Base.class
|
45
|
+
- test/ExtBase.class
|
46
|
+
- test/IBase.class
|
43
47
|
- test/jp/co/infoseek/hp/arton/rjb/Base.class
|
48
|
+
- test/jp/co/infoseek/hp/arton/rjb/ExtBase.class
|
44
49
|
- test/jp/co/infoseek/hp/arton/rjb/IBase.class
|
45
|
-
- test/jp/co/infoseek/hp/arton/rjb/Test.class
|
46
50
|
- test/jp/co/infoseek/hp/arton/rjb/Test$TestTypes.class
|
47
|
-
- test/jp/co/infoseek/hp/arton/rjb/
|
51
|
+
- test/jp/co/infoseek/hp/arton/rjb/Test.class
|
52
|
+
- test/JTest.class
|
53
|
+
- test/Test$TestTypes.class
|
54
|
+
- test/Test.class
|
48
55
|
- COPYING
|
49
56
|
- ChangeLog
|
50
57
|
- readme.sj
|
@@ -76,7 +83,7 @@ requirements:
|
|
76
83
|
- JDK 5.0
|
77
84
|
- " VC6 version of Ruby"
|
78
85
|
rubyforge_project:
|
79
|
-
rubygems_version: 1.3.
|
86
|
+
rubygems_version: 1.3.5
|
80
87
|
signing_key:
|
81
88
|
specification_version: 3
|
82
89
|
summary: Ruby Java bridge
|