Skip to content

Commit 59001d3

Browse files
authored
Merge pull request #20 from PureSwift/feature/jvm-shims
Add JVM shims
2 parents ffb6fac + 3c7f16f commit 59001d3

File tree

4 files changed

+90
-3
lines changed

4 files changed

+90
-3
lines changed

.github/workflows/swift.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
matrix:
1010
swift: ['6.1']
1111
arch: ['aarch64', 'x86_64']
12-
sdk: ['24', '28', '29']
12+
sdk: ['24', '28', '29', '31', '33']
1313
runs-on: macos-15
1414
timeout-minutes: 30
1515
steps:

Package.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ var package = Package(
2929
dependencies: [
3030
.package(
3131
url: "https://github.com/PureSwift/swift-java.git",
32-
branch: "feature/android-shim"
32+
branch: "feature/android"
3333
),
3434
.package(
3535
url: "https://github.com/PureSwift/JavaLang.git",
@@ -398,6 +398,10 @@ var package = Package(
398398
),
399399
.target(
400400
name: "AndroidNDK",
401+
cxxSettings: [
402+
.define("ANDROID_NDK_VERSION", to: ndkVersion.description),
403+
.define("ANDROID_SDK_VERSION", to: sdkVersion.description)
404+
],
401405
linkerSettings: [
402406
.linkedLibrary("android", .when(platforms: [.android]))
403407
]

Sources/AndroidNDK/AndroidSupport.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#ifdef __ANDROID__
2+
3+
#include <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

Sources/AndroidNDK/src.c

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)