Skip to content

Commit c39174e

Browse files
committed
[JavaRuntime] Add Android shims
1 parent eb86790 commit c39174e

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2024 Apple Inc. and the Swift.org project authors
6+
// Licensed under Apache License v2.0
7+
//
8+
// See LICENSE.txt for license information
9+
// See CONTRIBUTORS.txt for the list of Swift.org project authors
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#ifdef __ANDROID__
16+
17+
#include <JavaRuntime.h>
18+
#include <android/log.h>
19+
#include <dlfcn.h>
20+
21+
// these are not exported by the Android SDK
22+
23+
extern "C" {
24+
using JavaRuntime_GetDefaultJavaVMInitArgs_fn = jint (*)(void *vm_args);
25+
using JavaRuntime_CreateJavaVM_fn = jint (*)(JavaVM **, JNIEnv **, void *);
26+
using JavaRuntime_GetCreatedJavaVMs_fn = jint (*)(JavaVM **, jsize, jsize *);
27+
}
28+
29+
static JavaRuntime_GetDefaultJavaVMInitArgs_fn
30+
JavaRuntime_GetDefaultJavaVMInitArgs;
31+
static JavaRuntime_CreateJavaVM_fn JavaRuntime_CreateJavaVM;
32+
static JavaRuntime_GetCreatedJavaVMs_fn JavaRuntime_GetCreatedJavaVMs;
33+
34+
static void *JavaRuntime_dlhandle;
35+
36+
__attribute__((constructor)) static void JavaRuntime_init(void) {
37+
JavaRuntime_dlhandle = dlopen("libnativehelper.so", RTLD_NOW | RTLD_LOCAL);
38+
if (JavaRuntime_dlhandle == nullptr) {
39+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
40+
"failed to open libnativehelper.so: %s", dlerror());
41+
return;
42+
}
43+
44+
JavaRuntime_GetDefaultJavaVMInitArgs =
45+
reinterpret_cast<JavaRuntime_GetDefaultJavaVMInitArgs_fn>(
46+
dlsym(JavaRuntime_dlhandle, "JNI_GetDefaultJavaVMInitArgs"));
47+
if (JavaRuntime_GetDefaultJavaVMInitArgs == nullptr)
48+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
49+
"JNI_GetDefaultJavaVMInitArgs not found: %s",
50+
dlerror());
51+
52+
JavaRuntime_CreateJavaVM = reinterpret_cast<JavaRuntime_CreateJavaVM_fn>(
53+
dlsym(JavaRuntime_dlhandle, "JNI_CreateJavaVM"));
54+
if (JavaRuntime_CreateJavaVM == nullptr)
55+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
56+
"JNI_CreateJavaVM not found: %s", dlerror());
57+
58+
JavaRuntime_GetCreatedJavaVMs =
59+
reinterpret_cast<JavaRuntime_GetCreatedJavaVMs_fn>(
60+
dlsym(JavaRuntime_dlhandle, "JNI_GetCreatedJavaVMs"));
61+
if (JavaRuntime_GetCreatedJavaVMs == nullptr)
62+
__android_log_print(ANDROID_LOG_FATAL, "JavaRuntime",
63+
"JNI_GetCreatedJavaVMs not found: %s", dlerror());
64+
}
65+
66+
__attribute__((destructor)) static void JavaRuntime_deinit(void) {
67+
if (JavaRuntime_dlhandle) {
68+
dlclose(JavaRuntime_dlhandle);
69+
JavaRuntime_dlhandle = nullptr;
70+
}
71+
72+
JavaRuntime_GetDefaultJavaVMInitArgs = nullptr;
73+
JavaRuntime_CreateJavaVM = nullptr;
74+
JavaRuntime_GetCreatedJavaVMs = nullptr;
75+
}
76+
77+
jint JNI_GetDefaultJavaVMInitArgs(void *vm_args) {
78+
if (JavaRuntime_GetDefaultJavaVMInitArgs == nullptr)
79+
return JNI_ERR;
80+
81+
return (*JavaRuntime_GetDefaultJavaVMInitArgs)(vm_args);
82+
}
83+
84+
jint JNI_CreateJavaVM(JavaVM **vm, JNIEnv **env, void *vm_args) {
85+
if (JavaRuntime_CreateJavaVM == nullptr)
86+
return JNI_ERR;
87+
88+
return (*JavaRuntime_CreateJavaVM)(vm, env, vm_args);
89+
}
90+
91+
jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs) {
92+
if (JavaRuntime_GetCreatedJavaVMs == nullptr)
93+
return JNI_ERR;
94+
95+
return (*JavaRuntime_GetCreatedJavaVMs)(vmBuf, bufLen, nVMs);
96+
}
97+
98+
#endif

0 commit comments

Comments
 (0)