@@ -243,6 +243,13 @@ public override void DeleteWeakGlobalReference (ref JniObjectReference value)
243243 }
244244
245245 class AndroidTypeManager : JniRuntime . JniTypeManager {
246+ struct JniRemappingReplacementMethod
247+ {
248+ public string target_type ;
249+ public string target_name ;
250+ public bool is_static ;
251+ } ;
252+
246253 bool jniAddNativeMethodRegistrationAttributePresent ;
247254
248255 public AndroidTypeManager ( bool jniAddNativeMethodRegistrationAttributePresent )
@@ -317,123 +324,57 @@ protected override IEnumerable<string> GetSimpleReferences (Type type)
317324 } ;
318325 }
319326
327+ [ DllImport ( AndroidRuntime . InternalDllName , CallingConvention = CallingConvention . Cdecl ) ]
328+ static extern IntPtr _monodroid_lookup_replacement_type ( string jniSimpleReference ) ;
329+
320330 protected override string ? GetReplacementTypeCore ( string jniSimpleReference )
321331 {
322- if ( JNIEnv . ReplacementTypes == null ) {
332+ if ( ! JNIEnv . jniRemappingInUse ) {
323333 return null ;
324334 }
325- if ( JNIEnv . ReplacementTypes . TryGetValue ( jniSimpleReference , out var v ) ) {
326- return v ;
335+
336+ IntPtr ret = _monodroid_lookup_replacement_type ( jniSimpleReference ) ;
337+ if ( ret == IntPtr . Zero ) {
338+ return null ;
327339 }
328- return null ;
340+
341+ return Marshal . PtrToStringAnsi ( ret ) ;
329342 }
330343
344+ [ DllImport ( AndroidRuntime . InternalDllName , CallingConvention = CallingConvention . Cdecl ) ]
345+ static extern IntPtr _monodroid_lookup_replacement_method_info ( string jniSourceType , string jniMethodName , string jniMethodSignature ) ;
346+
331347 protected override JniRuntime . ReplacementMethodInfo ? GetReplacementMethodInfoCore ( string jniSourceType , string jniMethodName , string jniMethodSignature )
332348 {
333- if ( JNIEnv . ReplacementMethods == null ) {
349+ if ( ! JNIEnv . jniRemappingInUse ) {
334350 return null ;
335351 }
336- #if ! STRUCTURED
337- if ( ! JNIEnv . ReplacementMethods . TryGetValue ( CreateReplacementMethodsKey ( jniSourceType , jniMethodName , jniMethodSignature ) , out var r ) &&
338- ! JNIEnv . ReplacementMethods . TryGetValue ( CreateReplacementMethodsKey ( jniSourceType , jniMethodName , GetMethodSignatureWithoutReturnType ( ) ) , out r ) &&
339- ! JNIEnv . ReplacementMethods . TryGetValue ( CreateReplacementMethodsKey ( jniSourceType , jniMethodName , null ) , out r ) ) {
340- return null ;
341- }
342- ReadOnlySpan < char > replacementInfo = r ;
343-
344- var targetType = GetNextString ( ref replacementInfo ) ;
345- var targetName = GetNextString ( ref replacementInfo ) ;
346- var targetSig = GetNextString ( ref replacementInfo ) ;
347- var paramCountStr = GetNextString ( ref replacementInfo ) ;
348- var isStaticStr = GetNextString ( ref replacementInfo ) ;
349352
350- int ? paramCount = null ;
351- if ( ! paramCountStr . IsEmpty ) {
352- if ( ! int . TryParse ( paramCountStr , 0 , System . Globalization . CultureInfo . InvariantCulture , out var count ) ) {
353- return null ;
354- }
355- paramCount = count ;
353+ IntPtr retInfo = _monodroid_lookup_replacement_method_info ( jniSourceType , jniMethodName , jniMethodSignature ) ;
354+ if ( retInfo == IntPtr . Zero ) {
355+ return null ;
356356 }
357357
358- bool isStatic = false ;
359- if ( isStaticStr . Equals ( "true" , StringComparison . Ordinal ) ) {
360- isStatic = true ;
361- }
358+ var method = new JniRemappingReplacementMethod ( ) ;
359+ method = Marshal . PtrToStructure < JniRemappingReplacementMethod > ( retInfo ) ;
362360
363- if ( targetSig . IsEmpty && isStatic ) {
364- paramCount = paramCount ?? JniMemberSignature . GetParameterCountFromMethodSignature ( jniMethodSignature ) ;
365- paramCount ++ ;
361+ int ? paramCount = null ;
362+ if ( method . is_static ) {
363+ paramCount = JniMemberSignature . GetParameterCountFromMethodSignature ( jniMethodSignature ) + 1 ;
366364 jniMethodSignature = $ "(L{ jniSourceType } ;" + jniMethodSignature . Substring ( "(" . Length ) ;
367365 }
368366
369367 return new JniRuntime . ReplacementMethodInfo {
370368 SourceJniType = jniSourceType ,
371369 SourceJniMethodName = jniMethodName ,
372370 SourceJniMethodSignature = jniMethodSignature ,
373- TargetJniType = targetType . IsEmpty ? jniSourceType : new string ( targetType ) ,
374- TargetJniMethodName = targetName . IsEmpty ? jniMethodName : new string ( targetName ) ,
375- TargetJniMethodSignature = targetSig . IsEmpty ? jniMethodSignature : new string ( targetSig ) ,
371+ TargetJniType = method . target_type ,
372+ TargetJniMethodName = method . target_name ,
373+ TargetJniMethodSignature = jniMethodSignature ,
376374 TargetJniMethodParameterCount = paramCount ,
377- TargetJniMethodInstanceToStatic = isStatic ,
375+ TargetJniMethodInstanceToStatic = method . is_static ,
378376 } ;
379- #else
380- if ( ! JNIEnv . ReplacementMethods . TryGetValue ( ( jniSourceType , jniMethodName , jniMethodSignature ) , out var r ) &&
381- ! JNIEnv . ReplacementMethods . TryGetValue ( ( jniSourceType , jniMethodName , GetMethodSignatureWithoutReturnType ( ) ) , out r ) &&
382- ! JNIEnv . ReplacementMethods . TryGetValue ( ( jniSourceType , jniMethodName , null ) , out r ) ) {
383- return null ;
384- }
385- var targetSig = r . TargetSignature ;
386- var paramCount = r . ParamCount ;
387- if ( targetSig == null && r . TurnStatic ) {
388- targetSig = $ "(L{ jniSourceType } ;" + jniMethodSignature . Substring ( "(" . Length ) ;
389- paramCount = paramCount ?? JniMemberSignature . GetParameterCountFromMethodSignature ( jniMethodSignature ) ;
390- paramCount ++ ;
391- }
392- return new JniRuntime . ReplacementMethodInfo {
393- SourceJniType = jniSourceType ,
394- SourceJniMethodName = jniMethodName ,
395- SourceJniMethodSignature = jniMethodSignature ,
396- TargetJniType = r . TargetType ?? jniSourceType ,
397- TargetJniMethodName = r . TargetName ?? jniMethodName ,
398- TargetJniMethodSignature = targetSig ?? jniMethodSignature ,
399- TargetJniMethodParameterCount = paramCount ,
400- TargetJniMethodInstanceToStatic = r . TurnStatic ,
401- } ;
402- #endif // !STRUCTURED
403-
404- string GetMethodSignatureWithoutReturnType ( )
405- {
406- int i = jniMethodSignature . IndexOf ( ')' ) ;
407- return jniMethodSignature . Substring ( 0 , i + 1 ) ;
408- }
409-
410- string GetValue ( string ? value )
411- {
412- return value == null ? "null" : $ "\" { value } \" ";
413- }
414-
415- ReadOnlySpan < char > GetNextString ( ref ReadOnlySpan < char > info )
416- {
417- int index = info . IndexOf ( '\t ' ) ;
418- var r = info ;
419- if ( index >= 0 ) {
420- r = info . Slice ( 0 , index ) ;
421- info = info . Slice ( index + 1 ) ;
422- return r ;
423- }
424- info = default ;
425- return r ;
426- }
427377 }
428-
429- static string CreateReplacementMethodsKey ( string ? sourceType , string ? methodName , string ? methodSignature ) =>
430- new StringBuilder ( )
431- . Append ( sourceType )
432- . Append ( '\t ' )
433- . Append ( methodName )
434- . Append ( '\t ' )
435- . Append ( methodSignature )
436- . ToString ( ) ;
437378#endif // NET
438379
439380 delegate Delegate GetCallbackHandler ( ) ;
0 commit comments