Skip to content

Commit 2cf8ac9

Browse files
committed
[java-interop] logging; don't require RTLD_LOCAL
Context: dotnet/android#5031 Context: https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=3998131&view=logs&j=db00894d-3ef4-5d97-073c-254fbd613a41&t=379a81d4-3138-5f28-ec7b-ce4074947b64 The xamarin-android integration PR is experiencing integration test failures with the Android Designer: Renderer >> 4 [monodroid] Calling into managed runtime init Renderer (error) >> Renderer (error) >> Unhandled Exception: Renderer (error) >> System.EntryPointNotFoundException: java_interop_jnienv_get_java_vm assembly:<unknown assembly> type:<unknown type> member:(null) Renderer (error) >> at (wrapper managed-to-native) Java.Interop.NativeMethods.java_interop_jnienv_get_java_vm(intptr,intptr&) Renderer (error) >> at Java.Interop.JniEnvironment+References.GetJavaVM (System.IntPtr jnienv, System.IntPtr& vm) [0x00000] in <0f003a4904fd44d0a8cc6a63962ab40b>:0 Renderer (error) >> at Java.Interop.JniEnvironmentInfo.set_EnvironmentPointer (System.IntPtr value) [0x00037] in <0f003a4904fd44d0a8cc6a63962ab40b>:0 Renderer (error) >> at Java.Interop.JniEnvironmentInfo..ctor (System.IntPtr environmentPointer, Java.Interop.JniRuntime runtime) [0x00006] in <0f003a4904fd44d0a8cc6a63962ab40b>:0 Renderer (error) >> at Java.Interop.JniRuntime..ctor (Java.Interop.JniRuntime+CreationOptions options) [0x0017b] in <0f003a4904fd44d0a8cc6a63962ab40b>:0 Renderer (error) >> at Android.Runtime.AndroidRuntime..ctor (System.IntPtr jnienv, System.IntPtr vm, System.Boolean allocNewObjectSupported, System.IntPtr classLoader, System.IntPtr classLoader_loadClass, System.Boolean jniAddNativeMethodRegistrationAttributePresent) [0x00000] in /Users/builder/azdo/_work/4/s/xamarin-android/src/Mono.Android/Android.Runtime/AndroidRuntime.cs:25 The question is, *why*. @jonpryor still isn't sure, but has a conjecture: among the changes involved is a "forced" change to always use `RTLD_LAZY | RTLD_LOCAL`, no matter what the calling code actually specified. For test purposes, update `java_interop_load_library()` to "pass through" the flags value on Unix, so that the calling code can continue to use e.g. `RTLD_GLOBAL`, if desired. Let's see if that fixes anything? Additionally, add MOAR LOGGING MESSAGES to help see what's happening.
1 parent bf2c410 commit 2cf8ac9

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

src/java-interop/java-interop-dlfcn.cc

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "java-interop.h"
22
#include "java-interop-dlfcn.h"
33
#include "java-interop-util.h"
4+
#include "java-interop-logger.h"
45

56
#ifdef WINDOWS
67
#include <libloaderapi.h>
@@ -59,6 +60,7 @@ _free_error (char **error)
5960
static void
6061
_set_error (char **error, const char *message)
6162
{
63+
log_warn (LOG_DEFAULT, "# jonp: _set_error: message=%s", message);
6264
if (error == nullptr)
6365
return;
6466
*error = java_interop_strdup (message);
@@ -67,14 +69,25 @@ _set_error (char **error, const char *message)
6769
static void
6870
_set_error_to_last_error (char **error)
6971
{
72+
#if 1
73+
char *m = _get_last_dlerror ();
74+
log_warn (LOG_DEFAULT, "# jonp: _set_error_to_last_error: %s", m);
75+
if (error != nullptr) {
76+
*error = m;
77+
return;
78+
}
79+
free (m);
80+
#else
7081
if (error == nullptr)
7182
return;
7283
*error = _get_last_dlerror ();
84+
#endif
7385
}
7486

7587
void*
7688
java_interop_load_library (const char *path, unsigned int flags, char **error)
7789
{
90+
log_warn (LOG_DEFAULT, "# jonp: java_interop_load_library: path=`%s`", path);
7891
_free_error (error);
7992
if (path == nullptr) {
8093
_set_error (error, "path=nullptr is not supported");
@@ -105,7 +118,7 @@ java_interop_load_library (const char *path, unsigned int flags, char **error)
105118

106119
#else // ndef WINDOWS
107120

108-
handle = dlopen (path, RTLD_LAZY | RTLD_LOCAL);
121+
handle = dlopen (path, flags);
109122

110123
#endif // ndef WINDOWS
111124

@@ -119,6 +132,7 @@ java_interop_load_library (const char *path, unsigned int flags, char **error)
119132
void*
120133
java_interop_get_symbol_address (void *library, const char *symbol, char **error)
121134
{
135+
log_warn (LOG_DEFAULT, "# jonp: java_interop_get_symbol_address: library=%p symbol=%s", library, symbol);
122136
_free_error (error);
123137

124138
if (library == nullptr) {
@@ -147,13 +161,15 @@ java_interop_get_symbol_address (void *library, const char *symbol, char **error
147161
if (address == nullptr) {
148162
_set_error_to_last_error (error);
149163
}
164+
log_warn (LOG_DEFAULT, "# jonp: java_interop_get_symbol_address: address=%p", address);
150165

151166
return address;
152167
}
153168

154169
int
155170
java_interop_close_library (void* library, char **error)
156171
{
172+
log_warn (LOG_DEFAULT, "# jonp: java_interop_close_library: library=%p", library);
157173
_free_error (error);
158174
if (library == nullptr) {
159175
_set_error (error, "library=nullptr");

0 commit comments

Comments
 (0)