Skip to content

Commit b4ae6f4

Browse files
committed
[JavaRuntime] Add Android shims
1 parent ffb6fac commit b4ae6f4

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#ifdef __ANDROID__
2+
3+
#include <android/jni.h>
4+
#include <android/log.h>
5+
#include <dlfcn.h>
6+
7+
// these are not exported by the Android SDK
8+
9+
extern "C" {
10+
using JavaRuntime_GetDefaultJavaVMInitArgs_fn = jint (*)(void *vm_args);
11+
using JavaRuntime_CreateJavaVM_fn = jint (*)(JavaVM **, JNIEnv **, void *);
12+
using JavaRuntime_GetCreatedJavaVMs_fn = jint (*)(JavaVM **, jsize, jsize *);
13+
}
14+
15+
static JavaRuntime_GetDefaultJavaVMInitArgs_fn
16+
JavaRuntime_GetDefaultJavaVMInitArgs;
17+
static JavaRuntime_CreateJavaVM_fn JavaRuntime_CreateJavaVM;
18+
static JavaRuntime_GetCreatedJavaVMs_fn JavaRuntime_GetCreatedJavaVMs;
19+
20+
static void *JavaRuntime_dlhandle;
21+
22+
__attribute__((constructor)) static void JavaRuntime_init(void) {
23+
JavaRuntime_dlhandle = dlopen("libnativehelper.so", RTLD_NOW | RTLD_LOCAL);
24+
if (JavaRuntime_dlhandle == nullptr) {
25+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
26+
"failed to open libnativehelper.so: %s", dlerror());
27+
return;
28+
}
29+
30+
JavaRuntime_GetDefaultJavaVMInitArgs =
31+
reinterpret_cast<JavaRuntime_GetDefaultJavaVMInitArgs_fn>(
32+
dlsym(JavaRuntime_dlhandle, "JNI_GetDefaultJavaVMInitArgs"));
33+
if (JavaRuntime_GetDefaultJavaVMInitArgs == nullptr)
34+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
35+
"JNI_GetDefaultJavaVMInitArgs not found: %s",
36+
dlerror());
37+
38+
JavaRuntime_CreateJavaVM = reinterpret_cast<JavaRuntime_CreateJavaVM_fn>(
39+
dlsym(JavaRuntime_dlhandle, "JNI_CreateJavaVM"));
40+
if (JavaRuntime_CreateJavaVM == nullptr)
41+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
42+
"JNI_CreateJavaVM not found: %s", dlerror());
43+
44+
JavaRuntime_GetCreatedJavaVMs =
45+
reinterpret_cast<JavaRuntime_GetCreatedJavaVMs_fn>(
46+
dlsym(JavaRuntime_dlhandle, "JNI_GetCreatedJavaVMs"));
47+
if (JavaRuntime_GetCreatedJavaVMs == nullptr)
48+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
49+
"JNI_GetCreatedJavaVMs not found: %s", dlerror());
50+
}
51+
52+
__attribute__((destructor)) static void JavaRuntime_deinit(void) {
53+
if (JavaRuntime_dlhandle) {
54+
dlclose(JavaRuntime_dlhandle);
55+
JavaRuntime_dlhandle = nullptr;
56+
}
57+
58+
JavaRuntime_GetDefaultJavaVMInitArgs = nullptr;
59+
JavaRuntime_CreateJavaVM = nullptr;
60+
JavaRuntime_GetCreatedJavaVMs = nullptr;
61+
}
62+
63+
jint JNI_GetDefaultJavaVMInitArgs(void *vm_args) {
64+
if (JavaRuntime_GetDefaultJavaVMInitArgs == nullptr)
65+
return JNI_ERR;
66+
67+
return (*JavaRuntime_GetDefaultJavaVMInitArgs)(vm_args);
68+
}
69+
70+
jint JNI_CreateJavaVM(JavaVM **vm, JNIEnv **env, void *vm_args) {
71+
if (JavaRuntime_CreateJavaVM == nullptr)
72+
return JNI_ERR;
73+
74+
return (*JavaRuntime_CreateJavaVM)(vm, env, vm_args);
75+
}
76+
77+
jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs) {
78+
if (JavaRuntime_GetCreatedJavaVMs == nullptr)
79+
return JNI_ERR;
80+
81+
return (*JavaRuntime_GetCreatedJavaVMs)(vmBuf, bufLen, nVMs);
82+
}
83+
84+
#endif

0 commit comments

Comments
 (0)