Skip to content

Commit e45ad1e

Browse files
[jcw-gen] use Assembly Name instead of FullName for typemaps
Context: https://bugzilla.xamarin.com/show_bug.cgi?id=61073 The Java-to-Managed typemaps list types such as: ``` android/app/Activity Android.App.Activity, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065 ``` Let’s assume you have an Android project with the following assembly-level attribute: ``` [assembly:AssemblyVersion("1.0.0.*")] ``` Then on *every* build, the typemap is invalidated because your version number has been incremented. The fix here is to use the assembly’s short name via `GetName ().Name` or Mono.Cecil’s equivalent `AssemblyDefinition.Name.Name`. So the above typemap would only be `Android.App.Activity, Mono.Android`. These changes needed to happen in both `JavaNativeTypeManager` and `TypeNameMapGenerator`.
1 parent 57d5d51 commit e45ad1e

File tree

4 files changed

+45
-30
lines changed

4 files changed

+45
-30
lines changed

src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void WriteJavaToManaged (Stream output)
141141
var typeMap = GetTypeMapping (
142142
t => t.IsInterface || t.HasGenericParameters,
143143
JavaNativeTypeManager.ToJniName,
144-
t => t.GetAssemblyQualifiedName ());
144+
GetTypeName);
145145

146146
WriteBinaryMapping (output, typeMap);
147147
}
@@ -202,6 +202,15 @@ static void WriteBinaryMapping (Stream o, Dictionary<string, string> mapping)
202202
o.WriteByte (0x0);
203203
}
204204

205+
/// <summary>
206+
/// We need the equivalent of GetAssemblyQualifiedName, but without the Assembly's FullName
207+
/// NOTE: Cecil also uses / instead of + for nested types, see Java.Interop.Tools.Cecil.TypeDefinitionRocks.GetAssemblyQualifiedName
208+
/// </summary>
209+
static string GetTypeName (TypeDefinition type)
210+
{
211+
return type.FullName.Replace ('/', '+') + ", " + type.Module.Assembly.Name.Name;
212+
}
213+
205214
static Dictionary<byte[], byte[]> ToBinary(Dictionary<string, string> map, Encoding encoding)
206215
{
207216
return map.ToDictionary (e => encoding.GetBytes (e.Key), e => encoding.GetBytes (e.Value));
@@ -234,7 +243,7 @@ public void WriteManagedToJava (Stream output)
234243

235244
var typeMap = GetTypeMapping (
236245
t => false,
237-
t => t.GetAssemblyQualifiedName (),
246+
GetTypeName,
238247
JavaNativeTypeManager.ToJniName);
239248

240249
WriteBinaryMapping (output, typeMap);

src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void GenerateIndirectApplication (
9393
)
9494
{
9595
var actual = Generate (typeof (IndirectApplication), applicationJavaClass);
96-
var expected = @"package md5fef72cac46d04ae5bdc90af5bb6221ad;
96+
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
9797
9898
9999
public class IndirectApplication
@@ -144,7 +144,7 @@ public void monodroidClearReferences ()
144144
public void GenerateExportedMembers ()
145145
{
146146
var actual = Generate (typeof (ExportsMembers));
147-
var expected = @"package md5fef72cac46d04ae5bdc90af5bb6221ad;
147+
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
148148
149149
150150
public class ExportsMembers
@@ -156,7 +156,7 @@ extends java.lang.Object
156156
public static final String __md_methods;
157157
static {
158158
__md_methods =
159-
""n_GetInstance:()Lmd5fef72cac46d04ae5bdc90af5bb6221ad/ExportsMembers;:__export__\n"" +
159+
""n_GetInstance:()Lmd5f43cdfade412ae71b21bb70a5c2841ab/ExportsMembers;:__export__\n"" +
160160
""n_GetValue:()Ljava/lang/String;:__export__\n"" +
161161
""n_methodNamesNotMangled:()V:__export__\n"" +
162162
""n_CompletelyDifferentName:(Ljava/lang/String;I)Ljava/lang/String;:__export__\n"" +
@@ -167,17 +167,17 @@ extends java.lang.Object
167167
}
168168
169169
170-
public static md5fef72cac46d04ae5bdc90af5bb6221ad.ExportsMembers STATIC_INSTANCE = GetInstance ();
170+
public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers STATIC_INSTANCE = GetInstance ();
171171
172172
173173
public java.lang.String VALUE = GetValue ();
174174
175-
public static md5fef72cac46d04ae5bdc90af5bb6221ad.ExportsMembers GetInstance ()
175+
public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers GetInstance ()
176176
{
177177
return n_GetInstance ();
178178
}
179179
180-
private static native md5fef72cac46d04ae5bdc90af5bb6221ad.ExportsMembers n_GetInstance ();
180+
private static native md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers n_GetInstance ();
181181
182182
public java.lang.String GetValue ()
183183
{
@@ -240,7 +240,7 @@ public void monodroidClearReferences ()
240240
public void GenerateInnerClass ()
241241
{
242242
var actual = Generate (typeof (ExampleOuterClass));
243-
var expected = @"package md5fef72cac46d04ae5bdc90af5bb6221ad;
243+
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
244244
245245
246246
public class ExampleOuterClass

src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void WriteJavaToManaged ()
4949
v.WriteJavaToManaged (o);
5050
var a = ToArray (o);
5151
Save (a, "__j2m");
52-
var length = 259;
52+
var length = 204;
5353
var offset = 90;
5454
var e =
5555
"version=1\u0000" +
@@ -59,12 +59,12 @@ public void WriteJavaToManaged ()
5959
GetJ2MEntryLine (typeof (ActivityName), "activity/Name", offset, length) +
6060
GetJ2MEntryLine (typeof (ApplicationName), "application/Name", offset, length) +
6161
GetJ2MEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) +
62-
GetJ2MEntryLine (typeof (DefaultName), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName", offset, length) +
63-
GetJ2MEntryLine (typeof (DefaultName.A), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName_A", offset, length) +
64-
GetJ2MEntryLine (typeof (DefaultName.A.B), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName_A_B", offset, length) +
65-
GetJ2MEntryLine (typeof (DefaultName.C.D), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName_C_D", offset, length) +
66-
GetJ2MEntryLine (typeof (ExampleOuterClass), "md5fef72cac46d04ae5bdc90af5bb6221ad/ExampleOuterClass", offset, length) +
67-
GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5fef72cac46d04ae5bdc90af5bb6221ad/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
62+
GetJ2MEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) +
63+
GetJ2MEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) +
64+
GetJ2MEntryLine (typeof (DefaultName.A.B), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A_B", offset, length) +
65+
GetJ2MEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) +
66+
GetJ2MEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) +
67+
GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
6868
GetJ2MEntryLine (typeof (AbstractClass), "my/AbstractClass", offset, length) +
6969
GetJ2MEntryLine (typeof (ProviderName), "provider/Name", offset, length) +
7070
GetJ2MEntryLine (typeof (ReceiverName), "receiver/Name", offset, length) +
@@ -97,7 +97,7 @@ static byte [] ToArray (MemoryStream stream)
9797

9898
static string GetJ2MEntryLine (Type type, string jniName, int offset, int length)
9999
{
100-
return GetEntryPart (jniName, offset) + GetEntryPart (type.AssemblyQualifiedName, length - offset);
100+
return GetEntryPart (jniName, offset) + GetEntryPart (GetTypeName (type), length - offset);
101101
}
102102

103103
static string GetEntryPart (string value, int length)
@@ -113,8 +113,8 @@ public void WriteManagedToJava ()
113113
v.WriteManagedToJava (o);
114114
var a = ToArray (o);
115115
Save (a, "__m2j");
116-
var length = 259;
117-
var offset = 169;
116+
var length = 204;
117+
var offset = 114;
118118
var e =
119119
"version=1\u0000" +
120120
"entry-count=19\u0000" +
@@ -124,12 +124,12 @@ public void WriteManagedToJava ()
124124
GetM2JEntryLine (typeof (AbstractClassInvoker), "my/AbstractClass", offset, length) +
125125
GetM2JEntryLine (typeof (ActivityName), "activity/Name", offset, length) +
126126
GetM2JEntryLine (typeof (ApplicationName), "application/Name", offset, length) +
127-
GetM2JEntryLine (typeof (DefaultName.A.B), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName_A_B", offset, length) +
128-
GetM2JEntryLine (typeof (DefaultName.A), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName_A", offset, length) +
129-
GetM2JEntryLine (typeof (DefaultName.C.D), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName_C_D", offset, length) +
130-
GetM2JEntryLine (typeof (DefaultName), "md5fef72cac46d04ae5bdc90af5bb6221ad/DefaultName", offset, length) +
131-
GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5fef72cac46d04ae5bdc90af5bb6221ad/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
132-
GetM2JEntryLine (typeof (ExampleOuterClass), "md5fef72cac46d04ae5bdc90af5bb6221ad/ExampleOuterClass", offset, length) +
127+
GetM2JEntryLine (typeof (DefaultName.A.B), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A_B", offset, length) +
128+
GetM2JEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) +
129+
GetM2JEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) +
130+
GetM2JEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) +
131+
GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
132+
GetM2JEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) +
133133
GetM2JEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) +
134134
GetM2JEntryLine (typeof (NonStaticOuterClass.NonStaticInnerClass), "register/NonStaticOuterClass$NonStaticInnerClass", offset, length) +
135135
GetM2JEntryLine (typeof (NonStaticOuterClass), "register/NonStaticOuterClass", offset, length) +
@@ -147,7 +147,12 @@ public void WriteManagedToJava ()
147147

148148
static string GetM2JEntryLine (Type type, string jniName, int offset, int length)
149149
{
150-
return GetEntryPart (type.AssemblyQualifiedName, offset) + GetEntryPart (jniName, length - offset);
150+
return GetEntryPart (GetTypeName (type), offset) + GetEntryPart (jniName, length - offset);
151+
}
152+
153+
static string GetTypeName (Type type)
154+
{
155+
return type.FullName + ", " + type.Assembly.GetName ().Name;
151156
}
152157
}
153158
}

src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,16 @@ static bool IsPackageNamePreservedForAssembly (string assemblyName)
187187

188188
public static string GetPackageName (Type type)
189189
{
190-
if (IsPackageNamePreservedForAssembly (type.Assembly.GetName ().Name))
190+
string assemblyName = type.Assembly.GetName ().Name;
191+
if (IsPackageNamePreservedForAssembly (assemblyName))
191192
return type.Namespace.ToLowerInvariant ();
192193
switch (PackageNamingPolicy) {
193194
case PackageNamingPolicy.Lowercase:
194195
return type.Namespace.ToLowerInvariant ();
195196
case PackageNamingPolicy.LowercaseWithAssemblyName:
196-
return "assembly_" + (type.Assembly.GetName ().Name.Replace ('.', '_') + "." + type.Namespace).ToLowerInvariant ();
197+
return "assembly_" + (assemblyName.Replace ('.', '_') + "." + type.Namespace).ToLowerInvariant ();
197198
default:
198-
return "md5" + ToMd5 (type.Namespace + ":" + type.Assembly.FullName);
199+
return "md5" + ToMd5 (type.Namespace + ":" + assemblyName);
199200
}
200201
}
201202

@@ -515,7 +516,7 @@ public static string GetPackageName (TypeDefinition type)
515516
case PackageNamingPolicy.LowercaseWithAssemblyName:
516517
return "assembly_" + (type.Module.Assembly.Name.Name.Replace ('.', '_') + "." + type.Namespace).ToLowerInvariant ();
517518
default:
518-
return "md5" + ToMd5 (type.Namespace + ":" + type.Module.Assembly.Name.FullName);
519+
return "md5" + ToMd5 (type.Namespace + ":" + type.Module.Assembly.Name.Name);
519520
}
520521
}
521522
#endif

0 commit comments

Comments
 (0)