|
5 | 5 | #include "java-interop-logger.h" |
6 | 6 | #include "java-interop-util.h" |
7 | 7 |
|
8 | | -static struct DylibJVM *jvm = NULL; |
9 | 8 |
|
10 | | -int java_interop_jvm_load (const char *path) |
| 9 | +typedef int (*java_interop_JNI_CreateJavaVM_fptr) (JavaVM **p_vm, void **p_env, void *vm_args); |
| 10 | +typedef int (*java_interop_JNI_GetCreatedJavaVMs_fptr) (JavaVM **vmBuf, int bufLen, int *nVMs); |
| 11 | + |
| 12 | +struct DylibJVM { |
| 13 | + void *dl_handle; |
| 14 | + java_interop_JNI_CreateJavaVM_fptr JNI_CreateJavaVM; |
| 15 | + java_interop_JNI_GetCreatedJavaVMs_fptr JNI_GetCreatedJavaVMs; |
| 16 | +}; |
| 17 | + |
| 18 | +static struct DylibJVM *jvm; |
| 19 | + |
| 20 | +int |
| 21 | +java_interop_jvm_load (const char *path) |
11 | 22 | { |
| 23 | + if (jvm != NULL) { |
| 24 | + return JAVA_INTEROP_JVM_FAILED_ALREADY_LOADED; |
| 25 | + } |
| 26 | + |
12 | 27 | jvm = calloc (1, sizeof (struct DylibJVM)); |
| 28 | + if (!jvm) { |
| 29 | + return JAVA_INTEROP_JVM_FAILED_OOM; |
| 30 | + } |
13 | 31 |
|
14 | 32 | jvm->dl_handle = dlopen (path, RTLD_LAZY); |
15 | | - |
16 | | - if (!jvm->dl_handle) |
17 | | - return 0; |
| 33 | + if (!jvm->dl_handle) { |
| 34 | + free (jvm); |
| 35 | + jvm = NULL; |
| 36 | + return JAVA_INTEROP_JVM_FAILED_NOT_LOADED; |
| 37 | + } |
18 | 38 |
|
19 | 39 | int symbols_missing = 0; |
20 | 40 |
|
21 | | -#define LOAD_SYMBOL(symbol) \ |
22 | | - jvm->symbol = dlsym (jvm->dl_handle, #symbol); \ |
23 | | - if (!jvm->symbol) { \ |
24 | | - log_error (LOG_DEFAULT, "Failed to load JVM symbol: %s", #symbol); \ |
25 | | - symbols_missing = 1; \ |
26 | | - } |
| 41 | +#define LOAD_SYMBOL(symbol) do { \ |
| 42 | + jvm->symbol = dlsym (jvm->dl_handle, #symbol); \ |
| 43 | + if (!jvm->symbol) { \ |
| 44 | + log_error (LOG_DEFAULT, "Failed to load JVM symbol: %s", #symbol); \ |
| 45 | + symbols_missing = 1; \ |
| 46 | + } \ |
| 47 | + } while (0) |
| 48 | + |
| 49 | + LOAD_SYMBOL(JNI_CreateJavaVM); |
| 50 | + LOAD_SYMBOL(JNI_GetCreatedJavaVMs); |
27 | 51 |
|
28 | | - LOAD_SYMBOL(JNI_CreateJavaVM) |
29 | | - LOAD_SYMBOL(JNI_GetCreatedJavaVMs) |
| 52 | +#undef LOAD_SYMBOL |
30 | 53 |
|
31 | 54 | if (symbols_missing) { |
32 | | - log_fatal (LOG_DEFAULT, "Failed to load some Mono symbols, aborting..."); |
33 | | - exit (FATAL_EXIT_JVM_MISSING_SYMBOLS); |
| 55 | + free (jvm); |
| 56 | + jvm = NULL; |
| 57 | + return JAVA_INTEROP_JVM_FAILED_SYMBOL_MISSING; |
34 | 58 | } |
35 | 59 |
|
36 | | - return 1; |
| 60 | + return 0; |
37 | 61 | } |
38 | 62 |
|
39 | | -static inline void |
40 | | -_assert_dl_handle () |
41 | | -{ |
42 | | - if (!jvm || !jvm->dl_handle) { |
43 | | - log_fatal (LOG_DEFAULT, "Missing JVM symbols!"); |
44 | | - exit (FATAL_EXIT_JVM_MISSING_SYMBOLS); |
45 | | - } |
46 | | -} |
| 63 | +#define ji_return_val_if_fail(expr, val) do { if (!(expr)) return (val); } while (0) |
47 | 64 |
|
48 | 65 | int java_interop_jvm_create (JavaVM **p_vm, void **p_env, void *vm_args) |
49 | 66 | { |
50 | | - _assert_dl_handle (); |
| 67 | + ji_return_val_if_fail (jvm != NULL, JAVA_INTEROP_JVM_FAILED_NOT_LOADED); |
51 | 68 |
|
52 | 69 | return (*jvm->JNI_CreateJavaVM) (p_vm, p_env, vm_args); |
53 | 70 | } |
54 | 71 |
|
55 | 72 | int java_interop_jvm_list (JavaVM **vmBuf, int bufLen, int *nVMs) |
56 | 73 | { |
57 | | - _assert_dl_handle (); |
| 74 | + ji_return_val_if_fail (jvm != NULL, JAVA_INTEROP_JVM_FAILED_NOT_LOADED); |
58 | 75 |
|
59 | 76 | return (*jvm->JNI_GetCreatedJavaVMs) (vmBuf, bufLen, nVMs); |
60 | 77 | } |
0 commit comments