Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/third_party/jni/emjvm.cpp
7085 views
1
// Copyright 2013 The Emscripten Authors. All rights reserved.
2
// Emscripten is available under two separate licenses, the MIT license and the
3
// University of Illinois/NCSA Open Source License. Both these licenses can be
4
// found in the LICENSE file.
5
6
// Emscripten shims for JVM support
7
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include <string.h>
11
#include <assert.h>
12
13
#include "emjvm.h"
14
15
// invoke interface
16
17
jint DestroyJavaVM(JavaVM*) { exit(55); return NULL; }
18
jint AttachCurrentThread(JavaVM*, JNIEnv**, void*) { exit(66); return NULL; }
19
jint DetachCurrentThread(JavaVM*) { exit(77); return NULL; }
20
jint GetEnv(JavaVM*, void** env, jint); // forward def
21
jint AttachCurrentThreadAsDaemon(JavaVM*, JNIEnv**, void*) { exit(88); return NULL; }
22
23
// env - some of these are externs that are implemented in JS
24
25
jobject EMJVM_NewGlobalRef(JNIEnv*, jobject obj) {
26
return obj; // XXX no global refcounting, we just keep global singletons alive etc.
27
}
28
29
extern "C" {
30
extern jstring emjvm_newString(const jchar *chars, jsize len);
31
}
32
jstring EMJVM_NewString(JNIEnv*, const jchar* unicodeChars, jsize len) {
33
return emjvm_newString(unicodeChars, len);
34
}
35
36
extern "C" {
37
extern jclass emjvm_getObjectClass(JNIEnv*, jobject obj);
38
}
39
40
extern "C" {
41
extern jmethodID emjvm_getMethodID(jclass, const char*, const char*);
42
}
43
extern jmethodID EMJVM_GetMethodID(JNIEnv*, jclass clazz, const char* methodName, const char* sig) {
44
return emjvm_getMethodID(clazz, methodName, sig);
45
}
46
47
extern "C" {
48
extern jobject emjvm_callObjectMethod(JNIEnv*, jobject, jmethodID, va_list);
49
50
extern void emjvm_deleteLocalRef(JNIEnv*, jobject);
51
52
jsize emjvm_getArrayLength(JNIEnv*, jarray);
53
54
void emjvm_getByteArrayRegion(JNIEnv*, jbyteArray, jsize, jsize, jbyte*);
55
56
jclass emjvm_findClass(JNIEnv*, const char*);
57
58
jmethodID emjvm_getStaticMethodID(JNIEnv*, jclass, const char*, const char*);
59
60
jobject emjvm_callStaticObjectMethod(JNIEnv*, jclass, jmethodID, va_list);
61
62
jboolean emjvm_callBooleanMethod(JNIEnv*, jobject, jmethodID, va_list);
63
jboolean emjvm_callStaticBooleanMethod(JNIEnv*, jclass, jmethodID, va_list);
64
65
void emjvm_callVoidMethod(JNIEnv*, jobject, jmethodID, va_list);
66
67
jint emjvm_callIntMethod(JNIEnv*, jobject, jmethodID, va_list);
68
69
const char* emjvm_getStringUTFChars(JNIEnv*, jstring, jboolean*);
70
jsize emjvm_getStringUTFLength(JNIEnv*, jstring);
71
void emjvm_releaseStringUTFChars(JNIEnv*, jstring, const char*);
72
}
73
74
// JVM
75
76
struct EmJVM {
77
JavaVM jvm;
78
JNIInvokeInterface jvmFunctions;
79
80
JNIEnv env;
81
JNINativeInterface envFunctions;
82
83
EmJVM() {
84
// jvm
85
jvm.functions = &jvmFunctions;
86
87
jvmFunctions.DestroyJavaVM = DestroyJavaVM;
88
jvmFunctions.AttachCurrentThread = AttachCurrentThread;
89
jvmFunctions.DetachCurrentThread = DetachCurrentThread;
90
jvmFunctions.GetEnv = GetEnv;
91
jvmFunctions.AttachCurrentThreadAsDaemon = AttachCurrentThreadAsDaemon;
92
93
// env
94
memset(&envFunctions, 0, sizeof(envFunctions));
95
96
env.functions = &envFunctions;
97
98
envFunctions.NewGlobalRef = EMJVM_NewGlobalRef;
99
envFunctions.NewString = EMJVM_NewString;
100
envFunctions.GetObjectClass = emjvm_getObjectClass;
101
envFunctions.GetMethodID = EMJVM_GetMethodID;
102
envFunctions.CallObjectMethodV = emjvm_callObjectMethod;
103
envFunctions.DeleteLocalRef = emjvm_deleteLocalRef;
104
envFunctions.GetArrayLength = emjvm_getArrayLength;
105
envFunctions.GetByteArrayRegion = emjvm_getByteArrayRegion;
106
envFunctions.FindClass = emjvm_findClass;
107
envFunctions.GetStaticMethodID = emjvm_getStaticMethodID;
108
envFunctions.CallStaticObjectMethodV = emjvm_callStaticObjectMethod;
109
envFunctions.CallBooleanMethodV = emjvm_callBooleanMethod;
110
envFunctions.CallStaticBooleanMethodV = emjvm_callStaticBooleanMethod;
111
envFunctions.CallVoidMethodV = emjvm_callVoidMethod;
112
envFunctions.CallIntMethodV = emjvm_callIntMethod;
113
envFunctions.GetStringUTFChars = emjvm_getStringUTFChars;
114
envFunctions.GetStringUTFLength = emjvm_getStringUTFLength;
115
envFunctions.ReleaseStringUTFChars = emjvm_releaseStringUTFChars;
116
}
117
};
118
119
EmJVM emJVM;
120
121
// implement forward defs
122
123
jint GetEnv(JavaVM*, void** env, jint) {
124
*env = &emJVM.env;
125
return 0;
126
}
127
128
// external access from JS
129
130
extern "C" {
131
132
JavaVM* emscripten_get_jvm() { return &emJVM.jvm; }
133
134
JNIEnv* emscripten_get_jni_env() { return &emJVM.env; }
135
136
}
137
138
139