Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
d63fe4c
Localize unsupported Java reference error (#12803)
github-actions[bot] Sep 18, 2026
94a62a6
[Mono.Android] Align CoreCLR activation caching with Mono (#12816)
jonathanpeppers Sep 18, 2026
5fe19c2
Bump com.android.tools:r8 from 9.4.17 to 9.4.24 in /src/r8 (#12819)
dependabot[bot] Sep 18, 2026
bd53332
[Java.Interop] Use native UTF-8 JNI remaps (#12795)
simonrozsival Sep 18, 2026
461e3ad
[runtime] Move JNI type and method remapping to managed code
simonrozsival Sep 16, 2026
2ce6ff3
[runtime] Compare JNI remaps without transcoding
simonrozsival Sep 16, 2026
4acf7fe
[tests] Cover non-ASCII JNI remap lookup
simonrozsival Sep 16, 2026
11c2758
[runtime] Bound mixed ASCII comparison rescans
simonrozsival Sep 16, 2026
b405386
[build] Suppress generated remapping pointer warnings
simonrozsival Sep 16, 2026
2af8f5e
[tests] Update CoreCLR R8 APK size reference
simonrozsival Sep 16, 2026
6d62453
[build] Reuse cached UTF-8 remap keys
simonrozsival Sep 18, 2026
0300c1a
[build] Compute UTF-8 remap lengths without allocation
simonrozsival Sep 18, 2026
25652d2
[runtime] Use one replacement type lookup
simonrozsival Sep 18, 2026
7a277d2
[Java.Interop] Extend JNI member remapping contract
simonrozsival Sep 17, 2026
f8e92ce
[runtime] Extend generated JNI remapping data
simonrozsival Sep 17, 2026
f7b4401
[runtime] Address JNI remapping review
simonrozsival Sep 17, 2026
7956481
[tests] Fix Android remapping test compile
simonrozsival Sep 18, 2026
2e39a9e
[tests] Keep custom remapping fixtures desktop-only
simonrozsival Sep 18, 2026
00cfd3b
[build] Reconcile remapping generator after rebase
simonrozsival Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Documentation/docs-mobile/TOC.yml
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,8 @@
href: messages/xa1035.md
- name: XA1036
href: messages/xa1036.md
- name: XA1037
href: messages/xa1037.md
- name: XA1038
href: messages/xa1038.md
- name: XA1042
Expand Down
1 change: 1 addition & 0 deletions Documentation/docs-mobile/messages/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ or 'Help->Report a Problem' in Visual Studio for Mac.
+ [XA1035](xa1035.md): The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties.
+ [XA1036](xa1036.md): AndroidManifest.xml //uses-sdk/@android:minSdkVersion '29' does not match the $(SupportedOSPlatformVersion) value '21' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed).
Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist).
+ [XA1037](xa1037.md): Unsupported @(Reference) item: {item}
+ [XA1038](xa1038.md): The '{0}' MSBuild property has an invalid value. Value values are {1}.
+ [XA1039](xa1039.md): The Android Support libraries are not supported in .NET 9 and later, please migrate to AndroidX. See https://aka.ms/xamarin/androidx for more details.
+ [XA1040](xa1040.md): The NativeAOT runtime on Android is an experimental feature and not yet suitable for production use. File issues at: https://github.com/dotnet/android/issues
Expand Down
25 changes: 25 additions & 0 deletions Documentation/docs-mobile/messages/xa1037.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
title: .NET for Android error XA1037
description: XA1037 error code
ms.date: 09/16/2026
f1_keywords:
- "XA1037"
---

# .NET for Android error XA1037

## Example messages

```
error XA1037: Unsupported @(Reference) item: {item}
```

## Issue

The specified `@(Reference)` item is not a supported Java archive or source
directory.

## Solution

Update the `@(Reference)` item to reference a `.jar` file, an `.aar` file, or
a Java source directory.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public sealed class JniFieldInfo

public bool IsStatic {get; private set;}

internal JniType? StaticRedirect;

internal bool IsValid {
get {return ID != IntPtr.Zero;}
}
Expand Down Expand Up @@ -70,4 +72,3 @@ public override string ToString ()
}
}
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#nullable enable

using System;
using System.Runtime.InteropServices;

namespace Java.Interop
{
Expand All @@ -19,19 +20,20 @@ internal bool IsValid {

#if DEBUG
string? name, signature;
IntPtr nameUtf8, signatureUtf8;
#endif // !DEBUG

public string Name {
#if DEBUG
get => name ?? throw new NotSupportedException ();
get => name ??= GetUtf8String (nameUtf8);
#else // !DEBUG
get => throw new NotSupportedException ();
#endif // !DEBUG
}

public string Signature {
#if DEBUG
get => signature ?? throw new NotSupportedException ();
get => signature ??= GetUtf8String (signatureUtf8);
#else // !DEBUG
get => throw new NotSupportedException ();
#endif // !DEBUG
Expand All @@ -55,11 +57,54 @@ public JniMethodInfo (string name, string signature, IntPtr methodID, bool isSta
#endif // DEBUG
}

internal JniMethodInfo (IntPtr nameUtf8, string signature, IntPtr methodID, bool isStatic)
{
ID = methodID;
IsStatic = isStatic;

#if DEBUG
this.nameUtf8 = nameUtf8;
this.signature = signature;
#endif // DEBUG
}

internal JniMethodInfo (IntPtr nameUtf8, IntPtr signatureUtf8, IntPtr methodID, bool isStatic)
{
ID = methodID;
IsStatic = isStatic;

#if DEBUG
this.nameUtf8 = nameUtf8;
this.signatureUtf8 = signatureUtf8;
#endif // DEBUG
}

internal JniMethodInfo (string name, IntPtr signatureUtf8, IntPtr methodID, bool isStatic)
{
ID = methodID;
IsStatic = isStatic;

#if DEBUG
this.name = name;
this.signatureUtf8 = signatureUtf8;
#endif // DEBUG
}

#if DEBUG
static unsafe string GetUtf8String (IntPtr value)
{
if (value == IntPtr.Zero)
throw new NotSupportedException ();

return System.Text.Encoding.UTF8.GetString (MemoryMarshal.CreateReadOnlySpanFromNullTerminated ((byte*)value));
}
#endif // DEBUG

public override string ToString ()
{
#if DEBUG
bool haveName = !string.IsNullOrEmpty (name);
bool haveSig = !string.IsNullOrEmpty (signature);
bool haveName = !string.IsNullOrEmpty (name) || nameUtf8 != IntPtr.Zero;
bool haveSig = !string.IsNullOrEmpty (signature) || signatureUtf8 != IntPtr.Zero;
#else // DEBUG
bool haveName = false;
bool haveSig = false;
Expand All @@ -73,4 +118,3 @@ public override string ToString ()
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -202,109 +202,109 @@ partial class JniStaticFields {
public bool GetBooleanValue (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticBooleanField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticBooleanField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, bool value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticBooleanField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticBooleanField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public sbyte GetSByteValue (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticByteField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticByteField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, sbyte value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticByteField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticByteField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public char GetCharValue (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticCharField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticCharField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, char value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticCharField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticCharField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public short GetInt16Value (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticShortField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticShortField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, short value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticShortField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticShortField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public int GetInt32Value (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticIntField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticIntField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, int value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticIntField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticIntField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public long GetInt64Value (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticLongField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticLongField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, long value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticLongField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticLongField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public float GetSingleValue (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticFloatField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticFloatField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, float value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticFloatField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticFloatField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public double GetDoubleValue (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticDoubleField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticDoubleField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, double value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticDoubleField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticDoubleField (GetFieldDeclaringType (f).PeerReference, f, value);
}

public JniObjectReference GetObjectValue (string encodedMember)
{
var f = GetFieldInfo (encodedMember);
return JniEnvironment.StaticFields.GetStaticObjectField (Members.JniPeerType.PeerReference, f);
return JniEnvironment.StaticFields.GetStaticObjectField (GetFieldDeclaringType (f).PeerReference, f);
}

public void SetValue (string encodedMember, JniObjectReference value)
{
var f = GetFieldInfo (encodedMember);
JniEnvironment.StaticFields.SetStaticObjectField (Members.JniPeerType.PeerReference, f, value);
JniEnvironment.StaticFields.SetStaticObjectField (GetFieldDeclaringType (f).PeerReference, f, value);
}
}}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,39 @@ public JniFieldInfo GetFieldInfo (string encodedMember)
return InstanceFields.GetOrAdd (encodedMember, static (member, fields) => {
ReadOnlySpan<char> field, signature;
JniPeerMembers.GetNameAndSignature (member, out field, out signature);
return fields.Members.JniPeerType.GetInstanceField (field, signature);
return fields.GetFieldInfo (field, signature);
}, this);
}

JniFieldInfo GetFieldInfo (ReadOnlySpan<char> field, ReadOnlySpan<char> signature)
{
var newField = JniPeerMembers.GetReplacementFieldInfo (Members.JniPeerTypeName, field, signature);
if (newField.HasValue) {
var typeName = newField.Value.TargetJniType ?? Members.JniPeerTypeName;
var fieldName = newField.Value.TargetJniFieldName is string name ? name.AsSpan () : field;
var fieldSig = newField.Value.TargetJniFieldSignature is string sig ? sig.AsSpan () : signature;

using var t = new JniType (typeName);
if (t.TryGetInstanceField (fieldName, fieldSig, out var f)) {
return f;
}
}
if (Members.JniPeerType.TryGetInstanceField (field, signature, out var originalField)) {
return originalField;
}

newField = JniPeerMembers.GetBaseReplacementFieldInfo (Members.ManagedPeerType, field, signature);
if (newField.HasValue) {
var typeName = newField.Value.TargetJniType ?? Members.JniPeerTypeName;
var fieldName = newField.Value.TargetJniFieldName is string name ? name.AsSpan () : field;
var fieldSig = newField.Value.TargetJniFieldSignature is string sig ? sig.AsSpan () : signature;

using var t = new JniType (typeName);
if (t.TryGetInstanceField (fieldName, fieldSig, out var f)) {
return f;
}
}
return Members.JniPeerType.GetInstanceField (field, signature);
}
}}
}
Loading