54 {
55 JVM.Context.Diagnostics.GenericJniInfo($"loadLibrary: '{filename}' fromClass '{fromClass}'");
56
58 {
59 nint p = 0;
60
61 try
62 {
63
64 if ((p = LibJvm.Instance.JVM_LoadLibrary(filename)) == 0)
65 {
66 JVM.Context.Diagnostics.GenericJniInfo($"Failed to load library: path = '{filename}', message = {"NULL handle returned."}");
67 return 0;
68 }
69
70
71 foreach (var h in fromClass.ClassLoader.GetNativeLibraries())
72 {
73 if (h == p)
74 {
75 LibJvm.Instance.JVM_UnloadLibrary(p);
76 JVM.Context.Diagnostics.GenericJniWarning("Library was already loaded, returning same reference");
77 return p;
78 }
79 }
80
81
82 if (loaded.Contains(p))
83 {
84 var msg = $"Native library '{filename}' already loaded in another classloader.";
85 JVM.Context.Diagnostics.GenericJniError($"UnsatisfiedLinkError: {msg}");
86 throw new java.
lang.UnsatisfiedLinkError(msg);
87 }
88
89 JVM.Context.Diagnostics.GenericJniInfo($"Library loaded: {filename}, handle = 0x{p:X}");
90
91 try
92 {
93 var onload = LibJvm.Instance.JVM_FindLibraryEntry(p, NativeLibrary.MangleExportName("JNI_OnLoad", sizeof(nint) + sizeof(nint)));
94 if (onload != 0)
95 {
96 JVM.Context.Diagnostics.GenericJniInfo($"Calling JNI_OnLoad on: {filename}");
97 var f = new JNIFrame();
98 int v;
99 var w = f.Enter(ikvm.@internal.CallerID.create(fromClass.ClassObject, fromClass.ClassObject.getClassLoader()));
100 try
101 {
102 v = Marshal.GetDelegateForFunctionPointer<JNI_OnLoadFunc>(onload)(JavaVM.pJavaVM, null);
103 JVM.Context.Diagnostics.GenericJniInfo($"JNI_OnLoad returned: 0x{v:X8}");
104 }
105 finally
106 {
107 f.Leave();
108 }
109
110 if (JNIVM.IsSupportedJNIVersion(v) == false)
111 {
112 var msg = $"Unsupported JNI version 0x{v:X} required by {filename}";
113 JVM.Context.Diagnostics.GenericJniError($"UnsatisfiedLinkError: {msg}");
114 throw new java.
lang.UnsatisfiedLinkError(msg);
115 }
116 }
117 }
118 catch (EntryPointNotFoundException)
119 {
120
121 }
122
123
124 loaded.Add(p);
125 fromClass.ClassLoader.RegisterNativeLibrary(p);
126 return p;
127 }
128 catch (DllNotFoundException e)
129 {
130 JVM.Context.Diagnostics.GenericJniInfo($"Failed to load library: path = '{filename}', error = DllNotFoundException, message = {e.Message}");
131 return 0;
132 }
133 catch (Exception e)
134 {
135 JVM.Context.Diagnostics.GenericJniInfo($"Failed to load library: path = '{filename}', error = Exception, message = {e.Message}");
136 LibJvm.Instance.JVM_UnloadLibrary(p);
137 throw;
138 }
139 }
140 }
static readonly object SyncRoot