44 {
45#if FIRST_PASS || IMPORTER || EXPORTER
46 throw new NotImplementedException();
47#else
48 var loader = RuntimeClassLoader.FromCallerID((ikvm.@internal.CallerID)callerID);
49 var argl = sizeof(nint) + sizeof(nint);
50 for (int i = 1; sig[i] != ')'; i++)
51 {
52 switch (sig[i])
53 {
54 case '[':
55 argl += sizeof(nint);
56 while (sig[++i] == '[') ;
57 if (sig[i] == 'L')
58 while (sig[++i] != ';') ;
59 break;
60 case 'L':
61 argl += sizeof(nint);
62 while (sig[++i] != ';') ;
63 break;
64 case 'J':
65 case 'D':
66 argl += 8;
67 break;
68 case 'F':
69 case 'I':
70 case 'C':
71 case 'Z':
72 case 'S':
73 case 'B':
74 argl += 4;
75 break;
76 default:
77 Debug.Assert(false);
78 break;
79 }
80 }
81
84 var mangledSig =
JniMangle(sig.Substring(1, sig.IndexOf(
')') - 1));
85 var methodName = $"Java_{mangledClass}_{mangledName}";
86 var longMethodName = $"Java_{mangledClass}_{mangledName}__{mangledSig}";
87 JVM.Context.Diagnostics.GenericJniInfo($"Linking native method: {clazz}.{name}{sig}, classLoader = {loader}, methodName = {methodName}, longMethodName = {longMethodName}, argl = {argl}");
88
89 lock (JNINativeLoader.SyncRoot)
90 {
91 foreach (var p in loader.GetNativeLibraries())
92 {
93 if (LibJvm.Instance.JVM_FindLibraryEntry(p, NativeLibrary.MangleExportName(methodName, argl)) is nint h1 and not 0)
94 {
95 JVM.Context.Diagnostics.GenericJniInfo($"Native method {clazz}.{name}{sig} found in library 0x{p:X} (short)");
96 return h1;
97 }
98
99 if (LibJvm.Instance.JVM_FindLibraryEntry(p, NativeLibrary.MangleExportName(longMethodName, argl)) is nint h2 and not 0)
100 {
101 JVM.Context.Diagnostics.GenericJniInfo($"Native method {clazz}.{name}{sig} found in library 0x{p:X} (long)");
102 return h2;
103 }
104 }
105 }
106
107 var msg = $"{clazz}.{name}{sig}";
108 JVM.Context.Diagnostics.GenericJniError($"UnsatisfiedLinkError: {msg}");
109 throw new java.
lang.UnsatisfiedLinkError(msg);
110#endif
111 }
static string JniMangle(string name)