Skip to content

Commit 4bfe49d

Browse files
committed
[java-interop, Java.Interop] Securely load native libs
Fixes: #676 Context: https://liquid.microsoft.com/Web/Object/Read/ms.security/Requirements/Microsoft.Security.SystemsADM.10039#guide The current security guidance is that the [`System.Runtime.InteropServices.DefaultDllImportSearchPathsAttribute`][0] attribute should be placed either on the assembly or on `[DllImport]` methods to control and constrain where [`LoadLibraryEx()`][1] will look for native libraries, in particular to *prevent* looking for native libraries within e.g. the current working directory or `%PATH%` or any other "attacker-controlled" location. Update `Java.Interop.dll` and `Java.Runtime.Environment.dll` so that the [`DllImportSearchPath`][2] values `AssemblyDirectory` and `SafeDirectories` are used: * `AssemblyDirectory`: "include the directory that contains the assembly itself, and search that directory first." * `SafeDirectories`: "Include the application directory, the `%WinDir%\System32` directory, and user directories in the DLL search path. Additionally, update `src/java-interop` so that instead of requiring the use of [**dlopen**(3)] on Windows, the following new exports are added to support loading native libraries and resolving symbols from those native libraries: void* java_interop_load_library (const char *path, unsigned int flags, char **error); void* java_interop_get_symbol_address (void* library, const char *symbol, char **error); int java_interop_close_library (void* library, char **error); On Windows, `java_interop_load_library()` will use [`LoadLibraryEx()`][4] to load libraries from a constrained set of directories: * `LOAD_LIBRARY_SEARCH_APPLICATION_DIR`: "the application's installation directory is searched for the DLL and its dependencies" * `LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR`: "the directory that contains the DLL is temporarily added to the beginning of the list of directories that are searched for the DLL's dependencies." * `LOAD_LIBRARY_SEARCH_USER_DIRS`: "directories added using the `AddDllDirectory()` or the `SetDllDirectory()` function are searched for the DLL and its dependencies" In order to simplify the introduction of `java_interop_load_library()`, start *requiring* the presence of the symbols `mono_thread_get_managed_id` and `mono_thread_get_name_utf8`. These symbols have been present within Mono for ages at this point, and requiring means we don't need to support `dlopen(NULL)` semantics. Update the `@(ClInclude)` item group and `BuildMac` and related targets so that we properly rebuild things when e.g. `java-interop-dlfcn.h` changes, as would "normally" be expected. Finally, the continued use of `MONO_API` and other macros causes "weird" compiler issues when integrating with xamarin-android. Replace `MONO_API`/etc. use with `JAVA_INTEROP_API`/etc. instead. [0]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.defaultdllimportsearchpathsattribute?view=netcore-3.1 [1]: https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa?redirectedfrom=MSDN [2]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.dllimportsearchpath?view=netcore-3.1 [3]: https://linux.die.net/man/3/dlopen [4]: https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa
1 parent 007b35b commit 4bfe49d

File tree

11 files changed

+113
-145
lines changed

11 files changed

+113
-145
lines changed

src/Java.Interop/Java.Interop/JniRuntime.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
using System.Runtime.InteropServices;
1010
using System.Threading;
1111

12+
[assembly: DefaultDllImportSearchPathsAttribute (DllImportSearchPath.SafeDirectories | DllImportSearchPath.AssemblyDirectory)]
13+
1214
namespace Java.Interop
1315
{
1416
delegate int DestroyJavaVMDelegate (IntPtr javavm);

src/Java.Runtime.Environment/Java.Interop/JreRuntime.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
using System.Runtime.InteropServices;
88
using System.Threading;
99

10+
[assembly: DefaultDllImportSearchPathsAttribute (DllImportSearchPath.SafeDirectories | DllImportSearchPath.AssemblyDirectory)]
11+
1012
namespace Java.Interop {
1113

1214
struct JavaVMInitArgs {

src/java-interop/java-interop-gc-bridge-mono.cc

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
#include "logger.h"
2525
#endif /* !defined (ANDROID) */
2626

27-
#include <dlfcn.h>
28-
2927
#if defined (ANDROID) || defined (XAMARIN_ANDROID_DYLIB_MONO)
3028
using namespace xamarin::android;
3129
#endif
@@ -76,23 +74,6 @@ struct JavaInteropGCBridge {
7674
int gref_cleanup, lref_cleanup;
7775
};
7876

79-
typedef char* (*MonoThreadGetNameUtf8)(MonoThread*);
80-
typedef int32_t (*MonoThreadGetManagedId)(MonoThread*);
81-
82-
static MonoThreadGetManagedId _mono_thread_get_managed_id;
83-
static MonoThreadGetNameUtf8 _mono_thread_get_name_utf8;
84-
85-
static void
86-
lookup_optional_mono_thread_functions (void)
87-
{
88-
void *h = dlopen (NULL, RTLD_LAZY);
89-
if (!h)
90-
return;
91-
92-
_mono_thread_get_managed_id = reinterpret_cast<MonoThreadGetManagedId>(dlsym (h, "mono_thread_get_managed_id"));
93-
_mono_thread_get_name_utf8 = reinterpret_cast<MonoThreadGetNameUtf8>(dlsym (h, "mono_thread_get_name_utf8"));
94-
}
95-
9677
static jobject
9778
lref_to_gref (JNIEnv *env, jobject lref)
9879
{
@@ -275,8 +256,6 @@ java_interop_gc_bridge_new (JavaVM *jvm)
275256
}
276257
#endif /* defined (XAMARIN_ANDROID_DYLIB_MONO) */
277258

278-
lookup_optional_mono_thread_functions ();
279-
280259
JavaInteropGCBridge bridge = {0};
281260

282261
bridge.jvm = jvm;
@@ -1237,26 +1216,15 @@ gc_is_bridge_object (MonoObject *object)
12371216
static char *
12381217
get_thread_name (void)
12391218
{
1240-
if (_mono_thread_get_name_utf8) {
1241-
MonoThread *thread = mono_thread_current ();
1242-
return _mono_thread_get_name_utf8 (thread);
1243-
}
1244-
return strdup ("finalizer");
1219+
MonoThread *thread = mono_thread_current ();
1220+
return mono_thread_get_name_utf8 (thread);
12451221
}
12461222

12471223
static int64_t
12481224
get_thread_id (void)
12491225
{
1250-
if (_mono_thread_get_managed_id) {
1251-
MonoThread *thread = mono_thread_current ();
1252-
return _mono_thread_get_managed_id (thread);
1253-
}
1254-
#if __linux__
1255-
int64_t tid = (int64_t)((pid_t)syscall(SYS_gettid));
1256-
#else
1257-
int64_t tid = (int64_t) pthread_self ();
1258-
#endif
1259-
return tid;
1226+
MonoThread *thread = mono_thread_current ();
1227+
return mono_thread_get_managed_id (thread);
12601228
}
12611229

12621230
static void

src/java-interop/java-interop-gc-bridge.h

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,41 @@ struct JavaInterop_System_RuntimeTypeHandle {
1919
void *value;
2020
};
2121

22-
MONO_API JavaInteropGCBridge *java_interop_gc_bridge_get_current (void);
23-
MONO_API int java_interop_gc_bridge_set_current_once (JavaInteropGCBridge *bridge);
22+
JAVA_INTEROP_API JavaInteropGCBridge *java_interop_gc_bridge_get_current (void);
23+
JAVA_INTEROP_API int java_interop_gc_bridge_set_current_once (JavaInteropGCBridge *bridge);
2424

25-
MONO_API JavaInteropGCBridge *java_interop_gc_bridge_new (JavaVM *jvm);
26-
MONO_API int java_interop_gc_bridge_free (JavaInteropGCBridge *bridge);
25+
JAVA_INTEROP_API JavaInteropGCBridge *java_interop_gc_bridge_new (JavaVM *jvm);
26+
JAVA_INTEROP_API int java_interop_gc_bridge_free (JavaInteropGCBridge *bridge);
2727

28-
MONO_API int java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref_kind);
29-
MONO_API int java_interop_gc_bridge_wait_for_bridge_processing (JavaInteropGCBridge *bridge);
28+
JAVA_INTEROP_API int java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref_kind);
29+
JAVA_INTEROP_API int java_interop_gc_bridge_wait_for_bridge_processing (JavaInteropGCBridge *bridge);
3030

31-
MONO_API int java_interop_gc_bridge_add_current_app_domain (JavaInteropGCBridge *bridge);
32-
MONO_API int java_interop_gc_bridge_remove_current_app_domain (JavaInteropGCBridge *bridge);
31+
JAVA_INTEROP_API int java_interop_gc_bridge_add_current_app_domain (JavaInteropGCBridge *bridge);
32+
JAVA_INTEROP_API int java_interop_gc_bridge_remove_current_app_domain (JavaInteropGCBridge *bridge);
3333

34-
MONO_API int java_interop_gc_bridge_set_bridge_processing_field (JavaInteropGCBridge *bridge, struct JavaInterop_System_RuntimeTypeHandle type_handle, char *field_name);
35-
MONO_API int java_interop_gc_bridge_register_bridgeable_type (JavaInteropGCBridge *bridge, struct JavaInterop_System_RuntimeTypeHandle type_handle);
36-
MONO_API int java_interop_gc_bridge_enable (JavaInteropGCBridge *bridge, int enable);
34+
JAVA_INTEROP_API int java_interop_gc_bridge_set_bridge_processing_field (JavaInteropGCBridge *bridge, struct JavaInterop_System_RuntimeTypeHandle type_handle, char *field_name);
35+
JAVA_INTEROP_API int java_interop_gc_bridge_register_bridgeable_type (JavaInteropGCBridge *bridge, struct JavaInterop_System_RuntimeTypeHandle type_handle);
36+
JAVA_INTEROP_API int java_interop_gc_bridge_enable (JavaInteropGCBridge *bridge, int enable);
3737

38-
MONO_API int java_interop_gc_bridge_get_gref_count (JavaInteropGCBridge *bridge);
39-
MONO_API int java_interop_gc_bridge_get_weak_gref_count (JavaInteropGCBridge *bridge);
38+
JAVA_INTEROP_API int java_interop_gc_bridge_get_gref_count (JavaInteropGCBridge *bridge);
39+
JAVA_INTEROP_API int java_interop_gc_bridge_get_weak_gref_count (JavaInteropGCBridge *bridge);
4040

41-
MONO_API int java_interop_gc_bridge_lref_set_log_file (JavaInteropGCBridge *bridge, const char *gref_log_file);
42-
MONO_API FILE* java_interop_gc_bridge_lref_get_log_file (JavaInteropGCBridge *bridge);
43-
MONO_API int java_interop_gc_bridge_lref_set_log_level (JavaInteropGCBridge *bridge, int level);
44-
MONO_API void java_interop_gc_bridge_lref_log_message (JavaInteropGCBridge *bridge, int level, const char *message);
45-
MONO_API void java_interop_gc_bridge_lref_log_new (JavaInteropGCBridge *bridge, int lref_count, jobject curHandle, char curType, jobject newHandle, char newType, const char *thread_name, int64_t thread_id, const char *from);
46-
MONO_API void java_interop_gc_bridge_lref_log_delete (JavaInteropGCBridge *bridge, int lref_count, jobject handle, char type, const char *thread_name, int64_t thread_id, const char *from);
41+
JAVA_INTEROP_API int java_interop_gc_bridge_lref_set_log_file (JavaInteropGCBridge *bridge, const char *gref_log_file);
42+
JAVA_INTEROP_API FILE* java_interop_gc_bridge_lref_get_log_file (JavaInteropGCBridge *bridge);
43+
JAVA_INTEROP_API int java_interop_gc_bridge_lref_set_log_level (JavaInteropGCBridge *bridge, int level);
44+
JAVA_INTEROP_API void java_interop_gc_bridge_lref_log_message (JavaInteropGCBridge *bridge, int level, const char *message);
45+
JAVA_INTEROP_API void java_interop_gc_bridge_lref_log_new (JavaInteropGCBridge *bridge, int lref_count, jobject curHandle, char curType, jobject newHandle, char newType, const char *thread_name, int64_t thread_id, const char *from);
46+
JAVA_INTEROP_API void java_interop_gc_bridge_lref_log_delete (JavaInteropGCBridge *bridge, int lref_count, jobject handle, char type, const char *thread_name, int64_t thread_id, const char *from);
4747

48-
MONO_API int java_interop_gc_bridge_gref_set_log_file (JavaInteropGCBridge *bridge, const char *gref_log_file);
49-
MONO_API FILE* java_interop_gc_bridge_gref_get_log_file (JavaInteropGCBridge *bridge);
50-
MONO_API int java_interop_gc_bridge_gref_set_log_level (JavaInteropGCBridge *bridge, int level);
51-
MONO_API void java_interop_gc_bridge_gref_log_message (JavaInteropGCBridge *bridge, int level, const char *message);
52-
MONO_API int java_interop_gc_bridge_gref_log_new (JavaInteropGCBridge *bridge, jobject curHandle, char curType, jobject newHandle, char newType, const char *thread_name, int64_t thread_id, const char *from);
53-
MONO_API int java_interop_gc_bridge_gref_log_delete (JavaInteropGCBridge *bridge, jobject handle, char type, const char *thread_name, int64_t thread_id, const char *from);
48+
JAVA_INTEROP_API int java_interop_gc_bridge_gref_set_log_file (JavaInteropGCBridge *bridge, const char *gref_log_file);
49+
JAVA_INTEROP_API FILE* java_interop_gc_bridge_gref_get_log_file (JavaInteropGCBridge *bridge);
50+
JAVA_INTEROP_API int java_interop_gc_bridge_gref_set_log_level (JavaInteropGCBridge *bridge, int level);
51+
JAVA_INTEROP_API void java_interop_gc_bridge_gref_log_message (JavaInteropGCBridge *bridge, int level, const char *message);
52+
JAVA_INTEROP_API int java_interop_gc_bridge_gref_log_new (JavaInteropGCBridge *bridge, jobject curHandle, char curType, jobject newHandle, char newType, const char *thread_name, int64_t thread_id, const char *from);
53+
JAVA_INTEROP_API int java_interop_gc_bridge_gref_log_delete (JavaInteropGCBridge *bridge, jobject handle, char type, const char *thread_name, int64_t thread_id, const char *from);
5454

55-
MONO_API int java_interop_gc_bridge_weak_gref_log_new (JavaInteropGCBridge *bridge, jobject curHandle, char curType, jobject newHandle, char newType, const char *thread_name, int64_t thread_id, const char *from);
56-
MONO_API int java_interop_gc_bridge_weak_gref_log_delete (JavaInteropGCBridge *bridge, jobject handle, char type, const char *thread_name, int64_t thread_id, const char *from);
55+
JAVA_INTEROP_API int java_interop_gc_bridge_weak_gref_log_new (JavaInteropGCBridge *bridge, jobject curHandle, char curType, jobject newHandle, char newType, const char *thread_name, int64_t thread_id, const char *from);
56+
JAVA_INTEROP_API int java_interop_gc_bridge_weak_gref_log_delete (JavaInteropGCBridge *bridge, jobject handle, char type, const char *thread_name, int64_t thread_id, const char *from);
5757

5858
JAVA_INTEROP_END_DECLS
5959

src/java-interop/java-interop-jvm.cc

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <stdlib.h>
2-
#include <dlfcn.h>
32

43
#include "java-interop-jvm.h"
4+
#include "java-interop-dlfcn.h"
55
#include "java-interop-logger.h"
66
#include "java-interop-util.h"
77

@@ -33,11 +33,13 @@ java_interop_jvm_load_with_error_message (const char *path, char **error_message
3333
return JAVA_INTEROP_JVM_FAILED_OOM;
3434
}
3535

36-
jvm->dl_handle = dlopen (path, RTLD_LAZY);
36+
char *error = nullptr;
37+
jvm->dl_handle = java_interop_load_library (path, 0, &error);
3738
if (!jvm->dl_handle) {
3839
if (error_message) {
39-
*error_message = java_interop_strdup (dlerror ());
40+
*error_message = java_interop_strdup (error);
4041
}
42+
free (error);
4143
free (jvm);
4244
jvm = NULL;
4345
return JAVA_INTEROP_JVM_FAILED_NOT_LOADED;
@@ -46,10 +48,13 @@ java_interop_jvm_load_with_error_message (const char *path, char **error_message
4648
int symbols_missing = 0;
4749

4850
#define LOAD_SYMBOL_CAST(symbol, Type) do { \
49-
jvm->symbol = reinterpret_cast<Type>(dlsym (jvm->dl_handle, #symbol)); \
51+
error = nullptr; \
52+
jvm->symbol = reinterpret_cast<Type>(java_interop_get_symbol_address (jvm->dl_handle, #symbol, &error)); \
5053
if (!jvm->symbol) { \
51-
log_error (LOG_DEFAULT, "Failed to load JVM symbol: %s", #symbol); \
54+
log_error (LOG_DEFAULT, "Failed to load JVM symbol: %s: %s", #symbol, error); \
5255
symbols_missing = 1; \
56+
free (error); \
57+
error = nullptr; \
5358
} \
5459
} while (0)
5560
#define LOAD_SYMBOL(symbol) LOAD_SYMBOL_CAST(symbol, java_interop_ ## symbol ## _fptr)
@@ -61,7 +66,7 @@ java_interop_jvm_load_with_error_message (const char *path, char **error_message
6166
#undef LOAD_SYMBOL
6267

6368
if (symbols_missing) {
64-
dlclose (jvm->dl_handle);
69+
java_interop_close_library (jvm->dl_handle, nullptr);
6570
free (jvm);
6671
jvm = NULL;
6772
return JAVA_INTEROP_JVM_FAILED_SYMBOL_MISSING;

src/java-interop/java-interop-jvm.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ JAVA_INTEROP_BEGIN_DECLS
1313
#define JAVA_INTEROP_JVM_FAILED_OOM (JAVA_INTEROP_JVM_FAILED-3)
1414
#define JAVA_INTEROP_JVM_FAILED_SYMBOL_MISSING (JAVA_INTEROP_JVM_FAILED-4)
1515

16-
MONO_API int java_interop_jvm_load (const char *path);
17-
MONO_API int java_interop_jvm_load_with_error_message (const char *path, char **error);
18-
MONO_API int java_interop_jvm_create (JavaVM **p_vm, void **p_env, void *vm_args);
19-
MONO_API int java_interop_jvm_list (JavaVM **vmBuf, int bufLen, int *nVMs);
16+
JAVA_INTEROP_API int java_interop_jvm_load (const char *path);
17+
JAVA_INTEROP_API int java_interop_jvm_load_with_error_message (const char *path, char **error);
18+
JAVA_INTEROP_API int java_interop_jvm_create (JavaVM **p_vm, void **p_env, void *vm_args);
19+
JAVA_INTEROP_API int java_interop_jvm_list (JavaVM **vmBuf, int bufLen, int *nVMs);
2020

2121
JAVA_INTEROP_END_DECLS
2222

src/java-interop/java-interop-mono.h

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,13 @@
33

44
#include "java-interop.h"
55

6-
#if defined (XAMARIN_ANDROID_DYLIB_MONO)
7-
8-
#include "dylib-mono.h"
9-
#include "monodroid-glue.h"
10-
11-
#define mono_class_from_mono_type (monodroid_get_dylib ()->class_from_mono_type)
12-
#define mono_class_from_name (monodroid_get_dylib ()->class_from_name)
13-
#define mono_class_get_field_from_name (monodroid_get_dylib ()->class_get_field_from_name)
14-
#define mono_class_get_name (monodroid_get_dylib ()->class_get_name)
15-
#define mono_class_get_namespace (monodroid_get_dylib ()->class_get_namespace)
16-
#define mono_class_is_subclass_of (monodroid_get_dylib ()->class_is_subclass_of)
17-
#define mono_class_vtable (monodroid_get_dylib ()->class_vtable)
18-
#define mono_domain_get (monodroid_get_dylib ()->domain_get)
19-
#define mono_field_get_value (monodroid_get_dylib ()->field_get_value)
20-
#define mono_field_set_value (monodroid_get_dylib ()->field_set_value)
21-
#define mono_field_static_set_value (monodroid_get_dylib ()->field_static_set_value)
22-
#define mono_object_get_class (monodroid_get_dylib ()->object_get_class)
23-
#define mono_thread_attach (monodroid_get_dylib ()->thread_attach)
24-
#define mono_thread_current (monodroid_get_dylib ()->thread_current)
25-
#define mono_gc_register_bridge_callbacks (monodroid_get_dylib ()->gc_register_bridge_callbacks)
26-
#define mono_gc_wait_for_bridge_processing (monodroid_get_dylib ()->gc_wait_for_bridge_processing)
27-
28-
#else /* !defined (XAMARIN_ANDROID_DYLIB_MONO) */
29-
30-
#undef MONO_API_EXPORT
31-
#undef MONO_API_IMPORT
32-
#undef MONO_API
33-
34-
#include <mono/metadata/assembly.h>
35-
#include <mono/metadata/class.h>
36-
#include <mono/metadata/object.h>
37-
#include <mono/metadata/sgen-bridge.h>
38-
#include <mono/metadata/threads.h>
39-
#include <mono/utils/mono-counters.h>
40-
#include <mono/utils/mono-dl-fallback.h>
41-
42-
#endif /* !defined (XAMARIN_ANDROID_DYLIB_MONO) */
6+
#include <mono/metadata/assembly.h>
7+
#include <mono/metadata/class.h>
8+
#include <mono/metadata/object.h>
9+
#include <mono/metadata/sgen-bridge.h>
10+
#include <mono/metadata/threads.h>
11+
#include <mono/utils/mono-counters.h>
12+
#include <mono/utils/mono-dl-fallback.h>
4313

4414
JAVA_INTEROP_BEGIN_DECLS
4515

src/java-interop/java-interop-util.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef __JAVA_INTEROP_UTIL_H__
22
#define __JAVA_INTEROP_UTIL_H__
33

4+
#include <cstdlib>
5+
46
#ifdef WINDOWS
57
/* Those two conversion functions are only properly implemented on Windows
68
* because that's the only place where they should be useful.
@@ -44,7 +46,7 @@ _assert_valid_pointer (void *p, size_t size)
4446
}
4547

4648
log_fatal (LOG_DEFAULT, "Out of memory!");
47-
exit (FATAL_EXIT_OUT_OF_MEMORY);
49+
std::exit (FATAL_EXIT_OUT_OF_MEMORY);
4850
}
4951

5052
return p;

src/java-interop/java-interop.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<OutputPath>$(ToolOutputFullPath)</OutputPath>
55
<JNIEnvGenPath>$(BuildToolOutputFullPath)</JNIEnvGenPath>
66
<OutputName>java-interop</OutputName>
7-
<DefineSymbols>JI_DLL_EXPORT MONODEVELOP MONO_DLL_EXPORT</DefineSymbols>
7+
<DefineSymbols>JI_DLL_EXPORT MONODEVELOP JAVA_INTEROP_DLL_EXPORT</DefineSymbols>
88
<SourceDirectory>.</SourceDirectory>
99
</PropertyGroup>
1010

@@ -18,8 +18,12 @@
1818

1919
<ItemGroup>
2020
<ClInclude Include="java-interop.h" />
21+
<ClInclude Include="java-interop-dlfcn.h" />
2122
<ClInclude Include="java-interop-gc-bridge.h" />
23+
<ClInclude Include="java-interop-jvm.h" />
24+
<ClInclude Include="java-interop-logger.h" />
2225
<ClInclude Include="java-interop-mono.h" />
26+
<ClInclude Include="java-interop-util.h" />
2327
</ItemGroup>
2428

2529
<PropertyGroup>
@@ -37,6 +41,7 @@
3741
<ItemGroup>
3842
<ClCompile Include="jni.c" />
3943
<ClCompile Include="java-interop.cc" />
44+
<ClCompile Include="java-interop-dlfcn.cc" />
4045
<ClCompile Include="java-interop-jvm.cc" />
4146
<ClCompile Include="java-interop-logger.cc" />
4247
<ClCompile Include="java-interop-mono.cc" />

src/java-interop/java-interop.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,26 @@
55

66
#if defined(_MSC_VER)
77

8-
#define MONO_API_EXPORT __declspec(dllexport)
9-
#define MONO_API_IMPORT __declspec(dllimport)
8+
#define JAVA_INTEROP_API_EXPORT __declspec(dllexport)
9+
#define JAVA_INTEROP_API_IMPORT __declspec(dllimport)
1010

1111
#else /* defined(_MSC_VER */
1212

1313
#ifdef __GNUC__
14-
#define MONO_API_EXPORT __attribute__ ((visibility ("default")))
14+
#define JAVA_INTEROP_API_EXPORT __attribute__ ((visibility ("default")))
1515
#else
16-
#define MONO_API_EXPORT
16+
#define JAVA_INTEROP_API_EXPORT
1717
#endif
18-
#define MONO_API_IMPORT
18+
#define JAVA_INTEROP_API_IMPORT
1919

2020
#endif /* !defined(_MSC_VER) */
2121

22-
#if defined(MONO_DLL_EXPORT)
23-
#define MONO_API MONO_API_EXPORT
24-
#elif defined(MONO_DLL_IMPORT)
25-
#define MONO_API MONO_API_IMPORT
26-
#else /* !defined(MONO_DLL_IMPORT) && !defined(MONO_API_IMPORT) */
27-
#define MONO_API
22+
#if defined(MONO_DLL_EXPORT) || defined(JAVA_INTEROP_DLL_EXPORT)
23+
#define JAVA_INTEROP_API JAVA_INTEROP_API_EXPORT
24+
#elif defined(MONO_DLL_IMPORT) || defined(JAVA_INTEROP_DLL_IMPORT)
25+
#define JAVA_INTEROP_API JAVA_INTEROP_API_IMPORT
26+
#else /* !defined(MONO_DLL_IMPORT) && !defined(MONO_DLL_EXPORT) */
27+
#define JAVA_INTEROP_API
2828
#endif /* MONO_DLL_EXPORT... */
2929

3030
#ifdef __cplusplus
@@ -37,8 +37,8 @@
3737

3838
JAVA_INTEROP_BEGIN_DECLS
3939

40-
MONO_API char *java_interop_strdup (const char* value);
41-
MONO_API void java_interop_free (void *p);
40+
JAVA_INTEROP_API char *java_interop_strdup (const char* value);
41+
JAVA_INTEROP_API void java_interop_free (void *p);
4242

4343
JAVA_INTEROP_END_DECLS
4444

0 commit comments

Comments
 (0)