Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/third_party/jni/emjvm.js
7085 views
1
addToLibrary({
2
$EmJVM: {
3
debug: false,
4
5
nextId: 0,
6
objects: {},
7
classNames: {}, // class name => singleton object
8
9
addObject: function(o) {
10
var ret = EmJVM.nextId++;
11
EmJVM.objects[ret] = o;
12
o.id = ret;
13
o.refs = 1;
14
o.nextMethodId = 0;
15
// XXX Module.print('add object ' + JSON.stringify(o).substr(0, 80) + (ret > 5285 ? new Error().stack : ''));
16
return ret;
17
},
18
19
addSingletonObject: function(o) {
20
EmJVM.classNames[o.name] = o;
21
return EmJVM.addObject(o);
22
},
23
24
createString: function(data) {
25
return EmJVM.addObject({ name: 'string', value: data });
26
},
27
28
createByteArray: function(data) {
29
return EmJVM.addObject({ name: 'byteArray', value: data });
30
},
31
32
// utils
33
34
widecharToString: function(ptr, len) {
35
var nullTerminated = typeof(len) == "undefined";
36
var ret = "";
37
var i = 0;
38
var t;
39
while (1) {
40
t = getValue(ptr + 2 * i, 'i16');
41
if (nullTerminated && t == 0) break;
42
if (t != 0) {
43
ret += String.fromCharCode(t);
44
}
45
++i;
46
if (!nullTerminated && i == len) break;
47
};
48
return ret;
49
},
50
},
51
52
emjvm_newString__deps: ['$EmJVM'],
53
emjvm_newString: function(chars, len) {
54
return EmJVM.createString(EmJVM.widecharToString(chars, len));
55
},
56
57
emjvm_getStringUTFChars: function(jniEnv, string, isCopy) {
58
var obj = EmJVM.objects[string];
59
assert(obj.name == 'string');
60
if (isCopy) setValue(isCopy, 'i8', 1);
61
var len = lengthBytesUTF8(obj.value) + 1;
62
var buffer = _malloc(len);
63
stringToUTF8(obj.value, buffer, len);
64
return buffer;
65
},
66
67
emjvm_getStringUTFLength: function(jniEnv, string) {
68
var obj = EmJVM.objects[string];
69
if (obj.value) {
70
return obj.value.length;
71
}
72
return 0;
73
},
74
75
emjvm_releaseStringUTFChars: function(jniEnv, string, utf) {
76
},
77
78
emjvm_getObjectClass__deps: ['$EmJVM'],
79
emjvm_getObjectClass: function(env, jobject) {
80
if (EmJVM.debug) {
81
console.log('EMJVM_GetObjectClass+AddLocalRef: ' + [jobject]);
82
}
83
var obj = EmJVM.objects[jobject];
84
obj.refs++;
85
return jobject;
86
},
87
88
emjvm_getMethodID: function(jclass, name, sig) {
89
if (EmJVM.debug) {
90
console.log('EMJVM_GetMethodID: ' + [jclass, UTF8ToString(name), UTF8ToString(sig)]);
91
console.log('EMJVM_GetMethodID: ' + [EmJVM.objects[jclass].name]);
92
}
93
// assumes class <--> object, just called on singletons
94
name = UTF8ToString(name);
95
var obj = EmJVM.objects[jclass];
96
if (!obj[name]) {
97
throw 'missing implementation for ' + obj.name + '::' + name + ' : ' + new Error().stack;
98
}
99
if (!obj[name + '__methodId']) {
100
var methodId = obj.nextMethodId++;
101
obj[name + '__methodId'] = methodId;
102
obj['method__' + methodId] = obj[name];
103
obj['methodName__' + methodId] = name;
104
}
105
return obj[name + '__methodId'];
106
},
107
108
emjvm_getStaticMethodID: function(jniEnv, jclass, name, sig) {
109
// Pretend this to be the same as looking up a non-static method
110
return _emjvm_getMethodID(jclass, name, sig);
111
},
112
113
emjvm_callObjectMethod: function(jniEnv, jobject, methodId, varargs) {
114
if (EmJVM.debug) {
115
console.log('EMJVM_CallObjectMethod: ' + [jobject, EmJVM.objects[jobject].name, methodId, EmJVM.objects[jobject]['methodName__' + methodId]]);
116
}
117
return EmJVM.objects[jobject]['method__' + methodId](varargs);
118
},
119
120
emjvm_callStaticObjectMethod: function(jniEnv, jclass, methodId, varargs) {
121
// Pretend this to be the same as calling a non-static method
122
return _emjvm_callObjectMethod(jniEnv, jclass, methodId, varargs);
123
},
124
125
emjvm_callStaticBooleanMethod: function(jniEnv, jclass, methodId, varargs) {
126
// Only differs in return type
127
return _emjvm_callStaticObjectMethod(jniEnv, jclass, methodId, varargs);
128
},
129
130
emjvm_callBooleanMethod: function(jniEnv, jobject, methodId, varargs) {
131
// Pretend this to be the same as calling a non-static method
132
return _emjvm_callStaticBooleanMethod(jniEnv, jobject, methodId, varargs);
133
},
134
135
emjvm_callVoidMethod: function(jniEnv, jobject, methodId, varargs) {
136
_emjvm_callObjectMethod(jniEnv, jobject, methodId, varargs);
137
},
138
139
emjvm_callIntMethod: function(jniEnv, jobject, methodId, varargs) {
140
return _emjvm_callObjectMethod(jniEnv, jobject, methodId, varargs);
141
},
142
143
emjvm_deleteLocalRef: function(jniEnv, jobject) {
144
if (EmJVM.debug) {
145
console.log('EMJVM_DeleteLocalRef: ' + [jobject]);
146
}
147
var obj = EmJVM.objects[jobject];
148
obj.refs--;
149
if (obj.refs == 0) {
150
if (EmJVM.debug) {
151
console.log('EMJVM_DeleteLocalRef: remove ' + obj.name);
152
}
153
delete EmJVM.objects[jobject];
154
}
155
},
156
157
emjvm_getArrayLength: function(jniEnv, jobject) {
158
var obj = EmJVM.objects[jobject];
159
assert(obj.name == 'byteArray');
160
return obj.value.length;
161
},
162
163
emjvm_getByteArrayRegion: function(jniEnv, jobject, start, len, buf) {
164
var obj = EmJVM.objects[jobject];
165
assert(obj.name == 'byteArray');
166
assert(obj.value); // we set this to null below and assume we are never called again
167
if (EmJVM.debug) {
168
console.log('emjvm_getByteArrayRegion: ' + [jobject, obj.value.length, start, len, buf]);
169
}
170
assert(start + len <= obj.value.length);
171
assert(len == obj.value.length); // we assume users read it all, and we can now copy it all with set() and then free it
172
HEAPU8.set(obj.value, buf);
173
obj.value = null; // XXX assume byte arrays are one-shot
174
},
175
176
emjvm_findClass: function(env, name) {
177
name = UTF8ToString(name);
178
if (EmJVM.debug) {
179
console.log('emjvm_findClass: ' + [name]);
180
}
181
var obj = EmJVM.classNames[name];
182
assert(obj);
183
return obj.id;
184
},
185
});
186
187
188