1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
4 # Copyright 2014 Romain Chanoir <romain.chanoir@courrier.uqam.ca>
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
18 # Manipulats the Java Virtual Machine
20 # See: http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html
23 redef extern class JniEnv
24 fun print_error
(msg
: String)
27 if "NIT_TESTING".environ
!= "true" then exception_describe
32 print
"Compilation des classes Java ..."
33 assert sys
.system
("javac test_jvm/Queue.java") == 0
34 assert sys
.system
("javac test_jvm/Test2.java") == 0
35 assert sys
.system
("javac test_jvm/TestJvm.java") == 0
37 print
"Initialisation de la JVM ..."
39 var builder
= new JavaVMBuilder
40 builder
.options
.add
"-Djava.class.path=."
41 var jvm
= builder
.create_jvm
42 var env
= builder
.jni_env
46 assert not jvm
.env
.address_is_null
48 print
"---------------------Test 1----------------------"
50 var queue_c
= env
.find_class
("test_jvm/Queue")
51 if queue_c
.address_is_null
then env
.print_error
("Queue class not found")
53 # get the methods of the class
54 var f_init
= env
.get_method_id
(queue_c
, "<init>", "()V")
55 if f_init
.address_is_null
then env
.print_error
("fInit not found")
57 var f_push
= env
.get_method_id
(queue_c
, "push", "(Ljava/lang/String;)V")
58 if f_push
.address_is_null
then env
.print_error
("fPush not found")
60 var f_pop
= env
.get_method_id
(queue_c
, "pop", "()Ljava/lang/String;")
61 if f_pop
.address_is_null
then env
.print_error
("fPop not found")
63 var element1
= "premier"
64 var element2
= "deuxième"
65 var element3
= "troisième"
68 var queue
= env
.new_object
(queue_c
, f_init
)
69 if queue
.address_is_null
then env
.print_error
("object not initialized")
71 var arg_tab
= new Array[Object].with_items
(element1
)
73 # first call to push method
74 env
.call_void_method
(queue
, f_push
, arg_tab
)
75 arg_tab
= new Array[Object].with_items
(element2
)
76 env
.call_void_method
(queue
, f_push
, arg_tab
)
77 arg_tab
= new Array[Object].with_items
(element3
)
78 env
.call_void_method
(queue
, f_push
, arg_tab
)
80 var el
= env
.call_string_method
(queue
, f_pop
, null)
82 el
= env
.call_string_method
(queue
, f_pop
, null)
84 el
= env
.call_string_method
(queue
, f_pop
, null)
87 print
"--------------------Test 2---------------------"
89 var test_c
= env
.find_class
("test_jvm/TestJvm")
90 if test_c
.address_is_null
then env
.print_error
("TestJvm class not found")
92 f_init
= env
.get_method_id
(test_c
, "<init>", "()V")
93 if f_init
.address_is_null
then env
.print_error
("finit not found")
95 # Get the different methods ids
96 var m_bool
= env
.get_method_id
(test_c
, "isBool", "()Z")
97 if m_bool
.address_is_null
then env
.print_error
("mbool not found")
98 var m_char
= env
.get_method_id
(test_c
, "getC", "()C")
99 if m_char
.address_is_null
then env
.print_error
("mchar not found")
100 var m_i
= env
.get_method_id
(test_c
, "getI", "()I")
101 if m_i
.address_is_null
then env
.print_error
("mi not found")
102 var m_f
= env
.get_method_id
(test_c
, "getF", "()F")
103 if m_f
.address_is_null
then env
.print_error
("mf not found")
104 var m_test
= env
.get_method_id
(test_c
, "getTest", "()Ltest_jvm/Test2;")
105 if m_test
.address_is_null
then env
.print_error
("mtest not found")
108 var f_bool
=env
.get_field_id
(test_c
, "bool", "Z")
109 if f_bool
.address_is_null
then env
.print_error
("fbool not found")
110 var f_char
= env
.get_field_id
(test_c
, "c", "C")
111 if f_char
.address_is_null
then env
.print_error
("fchar not found")
112 var f_i
=env
.get_field_id
(test_c
, "i", "I")
113 if f_i
.address_is_null
then env
.print_error
("fi not found")
114 var f_f
= env
.get_field_id
(test_c
, "f", "F")
115 if f_f
.address_is_null
then env
.print_error
("ff not found")
116 var f_test
= env
.get_field_id
(test_c
, "test", "Ltest_jvm/TestJvm;")
119 var test
= env
.new_object
(test_c
, f_init
)
120 if test
.address_is_null
then env
.print_error
("object test not initialized")
122 # Retrieve field value with field ids
123 var v_bool
= env
.get_boolean_field
(test
, f_bool
)
124 if v_bool
== null then env
.print_error
("vbool not found")
125 var v_char
= env
.get_char_field
(test
, f_char
)
126 if v_char
== null then env
.print_error
("vchar not found")
127 var v_i
= env
.get_int_field
(test
, f_i
)
128 if v_i
== null then env
.print_error
("vi not found")
129 var v_f
= env
.get_float_field
(test
, f_f
)
130 if v_f
== null then env
.print_error
("vf not found")
131 var v_test1
= env
.get_object_field
(test
, f_test
)
132 if v_test1
== null then env
.print_error
("vtest1 not found")
134 # Set the new values for the fields
135 env
.set_boolean_field
(test
, f_bool
, true)
136 env
.set_char_field
(test
, f_char
, 'D')
137 env
.set_int_field
(test
, f_i
, 10)
138 env
.set_float_field
(test
, f_f
, 15.5)
139 env
.set_object_field
(test
, f_test
, test
)
141 # get the values using getter method
142 v_bool
= env
.call_boolean_method
(test
, m_bool
, null)
143 v_char
= env
.call_char_method
(test
, m_char
, null)
144 v_i
= env
.call_int_method
(test
, m_i
, null)
145 v_f
= env
.call_float_method
(test
, m_f
, null)
146 var v_test2
= env
.call_object_method
(test
, m_test
, null)
147 if v_test2
== null then env
.print_error
("vtest2 not found")
149 # assert the values of the fields