Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
31fa878
Some debug messages
grendello Mar 28, 2023
40646c5
Merge branch 'main' into blazor-hang
grendello Mar 28, 2023
a89f45b
Marshal methods tracing
grendello Mar 28, 2023
fd06651
Native backtrace implementation
grendello Mar 29, 2023
2193db1
Merge branch 'main' into blazor-hang
grendello Mar 30, 2023
0564634
[WIP] Stack unwinding (doesn't build yet)
grendello Mar 30, 2023
3732378
Build and use our own libunwind
grendello Mar 31, 2023
8b05e39
Merge branch 'main' into blazor-hang
grendello Apr 3, 2023
97c5127
Make lld really ignore missing symbols + other stuff
grendello Apr 3, 2023
d37a22a
Eliminate the need to use NDK when enabling marshal methods tracing
grendello Apr 4, 2023
1ca486a
Merge branch 'main' into blazor-hang
grendello Apr 5, 2023
fb7f7e6
Java stack trace implemented
grendello Apr 5, 2023
2f58b13
Merge branch 'main' into blazor-hang
grendello Apr 6, 2023
e3d2649
Add signal handlers to the report
grendello Apr 6, 2023
581194e
Merge branch 'main' into blazor-hang
grendello Apr 7, 2023
0ba212e
Day spent debugging
grendello Apr 7, 2023
a512324
Merge branch 'main' into blazor-hang
grendello Apr 11, 2023
8c1b27f
Merge branch 'main' into blazor-hang
grendello Apr 11, 2023
b8cb13d
Tracing code is going to live in a separate DSO
grendello Apr 11, 2023
0cf46bd
Merge branch 'main' into blazor-hang
grendello Apr 12, 2023
61f2114
Merge branch 'main' into blazor-hang
grendello Apr 12, 2023
d0ef3e7
Put tracing code in a separate library
grendello Apr 12, 2023
469e752
Merge branch 'main' into blazor-hang
grendello Apr 12, 2023
1076ed5
Don't package the tracing DSO unless told so
grendello Apr 13, 2023
d9d869c
Merge branch 'main' into blazor-hang
grendello Apr 14, 2023
c291dc4
Spent the day tracking registered and executed methods
grendello Apr 17, 2023
35be489
A small TODO
grendello Apr 17, 2023
4b595a8
Merge branch 'main' into blazor-hang
grendello Apr 24, 2023
4288baf
Make sure invariant culture is used
grendello Apr 24, 2023
b68b512
Merge branch 'main' into blazor-hang
grendello Apr 25, 2023
7eb75e3
Merge branch 'main' into blazor-hang
grendello Apr 27, 2023
caae9e9
Add some Java tracing + Java.Interop tracing
grendello Apr 27, 2023
6a48e52
Merge branch 'main' into blazor-hang
grendello Apr 28, 2023
72abfa3
More tracing, perhaps getting closer
grendello Apr 28, 2023
4b45d5f
Merge branch 'main' into blazor-hang
grendello May 4, 2023
48f4b6a
Base code for parameter and return value logging
grendello May 4, 2023
212f6ef
Different approach to printing params
grendello May 5, 2023
bc5b0f8
Progress towards supporting variadic functions
grendello May 8, 2023
7600af1
Well, it generates correct code now
grendello May 8, 2023
788bd63
Merge branch 'main' into blazor-hang
grendello May 9, 2023
19e79a2
Generated code not complete, won't compile
grendello May 9, 2023
cae9bb0
Merge branch 'main' into blazor-hang
grendello May 10, 2023
cae0bd8
Way too much time spent on this...
grendello May 10, 2023
9fd0b07
Merge branch 'main' into blazor-hang
grendello May 11, 2023
fd3eefd
Found and fixed an issue with marshal methods
grendello May 11, 2023
fde3078
asprintf call & co is complete
grendello May 12, 2023
46fe18b
Merge branch 'main' into blazor-hang
grendello May 15, 2023
79cf274
Merge branch 'main' into blazor-hang
grendello May 16, 2023
d942663
Function parameter and return value tracing works
grendello May 16, 2023
37c401a
Merge branch 'main' into blazor-hang
grendello May 17, 2023
a74882f
Preparations for better argument logging
grendello May 17, 2023
3673a3a
Merge branch 'main' into blazor-hang
grendello May 18, 2023
37b16d3
Third iteration... done for today
grendello May 18, 2023
9af8f8e
Merge branch 'main' into blazor-hang
grendello May 19, 2023
8f86bc7
Cul-de-sac, dead end, wrong way, doh
grendello May 19, 2023
f6df472
Merge branch 'main' into blazor-hang
grendello May 22, 2023
135744c
New approach to LLVM IR generation
grendello May 22, 2023
58965d1
Merge branch 'main' into blazor-hang
grendello May 23, 2023
ef27fe5
More steps towards new LLVM IR generator
grendello May 23, 2023
c9cb983
Merge branch 'main' into blazor-hang
grendello May 24, 2023
12b8a61
Moving forward with the new LLVM IR generator
grendello May 24, 2023
49b7d63
Rearchitecting things for simpler use
grendello May 25, 2023
c67fbb9
Merge branch 'main' into blazor-hang
grendello May 26, 2023
3d5e073
New generator is alive
grendello May 26, 2023
603afbb
Merge branch 'main' into blazor-hang
grendello May 29, 2023
ec099cf
Data generation progressing nicely.
grendello May 29, 2023
db5be23
Structures written fine, onto structure arrays tomorrow
grendello May 30, 2023
42437cd
Structure arrays done
grendello May 31, 2023
0f39485
Phew, array and structure handling simplified and unified
grendello Jun 1, 2023
c937202
Merge branch 'main' into blazor-hang
grendello Jun 2, 2023
f81fa85
ApplicationConfigNativeAssemblyGenerator switched to the new LLVM IR …
grendello Jun 2, 2023
0da112c
Merge branch 'main' into blazor-hang
grendello Jun 5, 2023
09fbf9c
Moving on with new LLVM IR generator
grendello Jun 5, 2023
fd93c1f
Merge branch 'main' into blazor-hang
grendello Jun 6, 2023
c32dc33
Release TypeMap composer converted to the new generator
grendello Jun 6, 2023
55aec7d
Merge branch 'main' into blazor-hang
grendello Jun 7, 2023
f35855b
Debug typemap generator converted
grendello Jun 7, 2023
2990041
Compressed assemblies composer converted
grendello Jun 7, 2023
cd4584b
Merge branch 'main' into blazor-hang
grendello Jun 12, 2023
d126d26
JNI remapping composer converted
grendello Jun 12, 2023
0de8a6f
Merge branch 'main' into blazor-hang
grendello Jun 13, 2023
7a23158
Data portion of the marshal methods generator done
grendello Jun 13, 2023
0fea526
Merge branch 'main' into blazor-hang
grendello Jun 14, 2023
3d27e22
Beginnings of code generation
grendello Jun 14, 2023
fb63716
Merge branch 'main' into blazor-hang
grendello Jun 15, 2023
5e98bc3
Code generation works
grendello Jun 15, 2023
11bf0a7
Merge branch 'main' into blazor-hang
grendello Jun 16, 2023
1ddf89f
Halfway through code generation
grendello Jun 16, 2023
80c510a
Merge branch 'main' into blazor-hang
grendello Jun 19, 2023
5c17d76
`call` sorted out, tomorrow onto `phi`
grendello Jun 19, 2023
76e4d0c
Merge branch 'main' into blazor-hang
grendello Jun 20, 2023
33c9ac3
Conversion to the new LLVM IR complete for everything except tracing
grendello Jun 20, 2023
69bd75e
Merge branch 'main' into blazor-hang
grendello Jun 21, 2023
4d8d4dc
Cleanup
grendello Jun 21, 2023
6799989
A bit more cleanup
grendello Jun 21, 2023
60b0a13
Merge branch 'main' into blazor-hang
grendello Jun 22, 2023
580aae9
Update libunwind to 1.7.0
grendello Jun 22, 2023
944b73b
Tracing progress
grendello Jun 22, 2023
2c74196
Merge branch 'main' into blazor-hang
grendello Jun 23, 2023
95d423d
asprintf progress, new style
grendello Jun 23, 2023
1ef3255
Add some more tracing capabilities
grendello Jun 26, 2023
e148e1b
Merge branch 'main' into blazor-hang
grendello Jun 27, 2023
5316425
More tracing improvements
grendello Jun 27, 2023
c11f03b
Merge branch 'main' into blazor-hang
grendello Jun 28, 2023
b864253
asprintf simpler, general `call` improvements, assorted fixes
grendello Jun 28, 2023
c1cad61
Merge branch 'main' into blazor-hang
grendello Jun 28, 2023
b5fc35f
Merge branch 'main' into blazor-hang
grendello Mar 8, 2024
76cd39a
Fixups after merge
grendello Mar 8, 2024
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
Prev Previous commit
Next Next commit
Java stack trace implemented
Also: introduce tracing modes, 'basic` for just the method enter/leave
messages and 'full' to include native and java stack traces on method
entry.
  • Loading branch information
grendello committed Apr 5, 2023
commit fb7f7e60b363daaeb874ded5530ac2fc0bfa77e4
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class GeneratePackageManagerJava : AndroidTask
public override string TaskPrefix => "GPM";

Guid buildId = Guid.NewGuid ();
MarshalMethodsTracingMode mmTracingMode;

[Required]
public ITaskItem[] ResolvedAssemblies { get; set; }
Expand Down Expand Up @@ -66,7 +67,7 @@ public class GeneratePackageManagerJava : AndroidTask
public bool InstantRunEnabled { get; set; }

public bool EnableMarshalMethods { get; set; }
public bool EnableMarshalMethodTracing { get; set; }
public string MarshalMethodsTracingMode { get; set; }
public string RuntimeConfigBinFilePath { get; set; }
public string BoundExceptionType { get; set; }

Expand All @@ -93,6 +94,8 @@ bool _Debug {

public override bool RunTask ()
{
mmTracingMode = MonoAndroidHelper.ParseMarshalMethodsTracingMode (MarshalMethodsTracingMode);

BuildId = buildId.ToString ();
Log.LogDebugMessage (" [Output] BuildId: {0}", BuildId);

Expand Down Expand Up @@ -412,7 +415,7 @@ void AddEnvironment ()
uniqueAssemblyNames,
marshalMethodsState?.MarshalMethods,
Log,
EnableMarshalMethodTracing
mmTracingMode
);
} else {
marshalMethodsAsmGen = new MarshalMethodsNativeAssemblyGenerator (assemblyCount, uniqueAssemblyNames);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,16 @@ sealed class InputFiles
[Required]
public string AndroidBinUtilsDirectory { get; set; }

public bool EnableMarshalMethodTracing { get; set; }
public string MarshalMethodsTracingMode { get; set; }

MarshalMethodsTracingMode mmTracingMode;
bool mmTracingEnabled;

public override System.Threading.Tasks.Task RunTaskAsync ()
{
mmTracingMode = MonoAndroidHelper.ParseMarshalMethodsTracingMode (MarshalMethodsTracingMode);
mmTracingEnabled = mmTracingMode != Tasks.MarshalMethodsTracingMode.None;

return this.WhenAll (GetLinkerConfigs (), RunLinker);
}

Expand Down Expand Up @@ -137,7 +143,7 @@ IEnumerable<Config> GetLinkerConfigs ()
"--warn-shared-textrel " +
"--fatal-warnings";

string stripSymbolsArg = DebugBuild || EnableMarshalMethodTracing ? String.Empty : " -s";
string stripSymbolsArg = DebugBuild || mmTracingEnabled ? String.Empty : " -s";

string ld = Path.Combine (AndroidBinUtilsDirectory, MonoAndroidHelper.GetExecutablePath (AndroidBinUtilsDirectory, "ld"));
var targetLinkerArgs = new List<string> ();
Expand Down Expand Up @@ -201,7 +207,7 @@ InputFiles GatherFilesForABI (string runtimeSharedLibrary, string abi, ITaskItem
{
List<string> extraLibraries = null;

if (EnableMarshalMethodTracing) {
if (mmTracingEnabled) {
string RID = MonoAndroidHelper.AbiToRid (abi);
AndroidTargetArch targetArch = MonoAndroidHelper.AbiToTargetArch (abi);
string clangLibraryAbi = MonoAndroidHelper.ArchToClangLibraryAbi (targetArch);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,8 @@ public void EmitLabel (LlvmIrFunction function, string labelName)
throw new ArgumentException ("must be reference to native function", nameof (targetRef));
}

if (targetSignature.Parameters.Count > 0) {
bool haveParameters = targetSignature.Parameters != null && targetSignature.Parameters.Count > 0;
if (haveParameters) {
if (arguments == null) {
throw new ArgumentNullException (nameof (arguments));
}
Expand Down Expand Up @@ -377,7 +378,7 @@ public void EmitLabel (LlvmIrFunction function, string labelName)

Output.Write ($"call {GetKnownIRType (targetSignature.ReturnType)} {targetRef.Reference} (");

if (targetSignature.Parameters.Count > 0) {
if (haveParameters) {
for (int i = 0; i < targetSignature.Parameters.Count; i++) {
LlvmIrFunctionParameter parameter = targetSignature.Parameters[i];
LlvmIrFunctionArgument argument = arguments[i];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ sealed class MarshalMethodName

const string mm_trace_func_enter_name = "_mm_trace_func_enter";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems kinda odd that most of the members here are camelCase or PascalCase, but then the new members are c_snake_case. Should this not be MMTraceFuncEnterName?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a standalone C/C++ function, so I used the C/C++ naming convention.

const string mm_trace_func_leave_name = "_mm_trace_func_leave";
const string mm_trace_init_name = "_mm_trace_init";

ICollection<string> uniqueAssemblyNames;
int numberOfAssembliesInApk;
Expand Down Expand Up @@ -205,9 +206,10 @@ sealed class MarshalMethodName
// Tracing
LlvmIrVariableReference? mm_trace_func_enter_ref;
LlvmIrVariableReference? mm_trace_func_leave_ref;
LlvmIrVariableReference? mm_trace_init_ref;

readonly bool generateEmptyCode;
readonly bool emitTracing;
readonly MarshalMethodsTracingMode tracingMode;

/// <summary>
/// Constructor to be used ONLY when marshal methods are DISABLED
Expand All @@ -222,15 +224,15 @@ public MarshalMethodsNativeAssemblyGenerator (int numberOfAssembliesInApk, IColl
/// <summary>
/// Constructor to be used ONLY when marshal methods are ENABLED
/// </summary>
public MarshalMethodsNativeAssemblyGenerator (int numberOfAssembliesInApk, ICollection<string> uniqueAssemblyNames, IDictionary<string, IList<MarshalMethodEntry>> marshalMethods, TaskLoggingHelper logger, bool emitTracing)
public MarshalMethodsNativeAssemblyGenerator (int numberOfAssembliesInApk, ICollection<string> uniqueAssemblyNames, IDictionary<string, IList<MarshalMethodEntry>> marshalMethods, TaskLoggingHelper logger, MarshalMethodsTracingMode tracingMode)
{
this.numberOfAssembliesInApk = numberOfAssembliesInApk;
this.uniqueAssemblyNames = uniqueAssemblyNames ?? throw new ArgumentNullException (nameof (uniqueAssemblyNames));
this.marshalMethods = marshalMethods;
this.logger = logger ?? throw new ArgumentNullException (nameof (logger));

generateEmptyCode = false;
this.emitTracing = emitTracing;
this.tracingMode = tracingMode;
}

public override void Init ()
Expand Down Expand Up @@ -662,12 +664,22 @@ void RenderMethodNameWithParams (CecilMethodDefinition md, StringBuilder buffer)

void WriteInitTracing (LlvmIrGenerator generator)
{
if (!emitTracing) {
if (tracingMode == MarshalMethodsTracingMode.None) {
return;
}

// Function names and declarations must match those in src/monodroid/jni/marshal-methods-tracing.hh
var mm_trace_init_sig = new LlvmNativeFunctionSignature (
returnType: typeof(void),
parameters: new List<LlvmIrFunctionParameter> {
new LlvmIrFunctionParameter (typeof(_JNIEnv), "env", isNativePointer: true), // JNIEnv *env
}
);
mm_trace_init_ref = new LlvmIrVariableReference (mm_trace_init_sig, mm_trace_init_name, isGlobal: true);

var mm_trace_func_enter_or_leave_params = new List<LlvmIrFunctionParameter> {
new LlvmIrFunctionParameter (typeof(_JNIEnv), "env", isNativePointer: true), // JNIEnv *env
new LlvmIrFunctionParameter (typeof(int), "tracing_mode"),
new LlvmIrFunctionParameter (typeof(uint), "mono_image_index"),
new LlvmIrFunctionParameter (typeof(uint), "class_index"),
new LlvmIrFunctionParameter (typeof(uint), "method_token"),
Expand All @@ -687,6 +699,7 @@ void WriteInitTracing (LlvmIrGenerator generator)
);
mm_trace_func_leave_ref = new LlvmIrVariableReference (mm_trace_func_leave_sig, mm_trace_func_leave_name, isGlobal: true);

WriteTraceDeclaration (mm_trace_init_name, mm_trace_init_sig.ReturnType, mm_trace_init_sig.Parameters);
WriteTraceDeclaration (mm_trace_func_enter_name, mm_trace_func_enter_sig.ReturnType, mm_trace_func_enter_sig.Parameters);
WriteTraceDeclaration (mm_trace_func_leave_name, mm_trace_func_leave_sig.ReturnType, mm_trace_func_leave_sig.Parameters);

Expand Down Expand Up @@ -749,8 +762,10 @@ void WriteMarshalMethod (LlvmIrGenerator generator, MarshalMethodInfo method, Ll

List<LlvmIrFunctionArgument>? trace_enter_leave_args = null;

if (emitTracing) {
if (tracingMode != MarshalMethodsTracingMode.None) {
trace_enter_leave_args = new List<LlvmIrFunctionArgument> {
new LlvmIrFunctionArgument (func.ParameterVariables[0]), // JNIEnv* env
new LlvmIrFunctionArgument (typeof(int), (int)tracingMode),
new LlvmIrFunctionArgument (typeof(uint), method.AssemblyCacheIndex),
new LlvmIrFunctionArgument (typeof(uint), method.ClassCacheIndex),
new LlvmIrFunctionArgument (typeof(uint), nativeCallback.MetadataToken.ToUInt32 ()),
Expand Down Expand Up @@ -812,7 +827,7 @@ void WriteMarshalMethod (LlvmIrGenerator generator, MarshalMethodInfo method, Ll
func.ParameterVariables.Select (pv => new LlvmIrFunctionArgument (pv)).ToList ()
);

if (emitTracing) {
if (tracingMode != MarshalMethodsTracingMode.None) {
generator.EmitCall (func, mm_trace_func_leave_ref, trace_enter_leave_args);
}

Expand Down Expand Up @@ -846,12 +861,23 @@ LlvmIrVariableReference WriteXamarinAppInitFunction (LlvmIrGenerator generator)
returnType: typeof (void),
attributeSetID: LlvmIrGenerator.FunctionAttributesXamarinAppInit,
parameters: new List<LlvmIrFunctionParameter> {
new LlvmIrFunctionParameter (typeof(_JNIEnv), "env", isNativePointer: true), // JNIEnv *env
fnParameter,
}
);

generator.WriteFunctionStart (func);
generator.EmitStoreInstruction (func, fnParameter, new LlvmIrVariableReference (get_function_pointer_sig, GetFunctionPointerFieldName, isGlobal: true));
if (tracingMode != MarshalMethodsTracingMode.None) {
generator.EmitCall (
func,
mm_trace_init_ref,
new List<LlvmIrFunctionArgument> {
new LlvmIrFunctionArgument (func.ParameterVariables[0]), // JNIEnv *env
}
);
}

generator.WriteFunctionEnd (func);

return new LlvmIrVariableReference (get_function_pointer_sig, GetFunctionPointerFieldName, isGlobal: true);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Xamarin.Android.Tasks
{
// Enumeration member numeric values MUST match those in src/monodroid/jni/marshal-methods-tracing.hh
public enum MarshalMethodsTracingMode
{
None = 0x00,
Basic = 0x01,
Full = 0x02,
}
}
17 changes: 17 additions & 0 deletions src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -614,5 +614,22 @@ public static string ArchToClangLibraryAbi (AndroidTargetArch arch)
throw new InvalidOperationException ($"Internal error: unsupported architecture '{arch}'");
}
}

public static MarshalMethodsTracingMode ParseMarshalMethodsTracingMode (string input)
{
if (String.IsNullOrEmpty (input) || String.Compare ("none", input, StringComparison.InvariantCultureIgnoreCase) == 0) {
return MarshalMethodsTracingMode.None;
}

if (String.Compare ("basic", input, StringComparison.InvariantCultureIgnoreCase) == 0) {
return MarshalMethodsTracingMode.Basic;
}

if (String.Compare ("full", input, StringComparison.InvariantCultureIgnoreCase) == 0) {
return MarshalMethodsTracingMode.Full;
}

throw new InvalidOperationException ($"Unsupported marshal methods tracing mode '{input}'");
}
}
}
12 changes: 9 additions & 3 deletions src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,13 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
<AndroidEnableMarshalMethods Condition=" '$(UsingAndroidNETSdk)' != 'True' ">False</AndroidEnableMarshalMethods>
<_AndroidUseMarshalMethods Condition=" '$(AndroidIncludeDebugSymbols)' == 'True' ">False</_AndroidUseMarshalMethods>
<_AndroidUseMarshalMethods Condition=" '$(AndroidIncludeDebugSymbols)' != 'True' ">$(AndroidEnableMarshalMethods)</_AndroidUseMarshalMethods>
<_AndroidEnableMarshalMethodTracing Condition=" '$(_AndroidEnableMarshalMethodTracing)' == '' ">False</_AndroidEnableMarshalMethodTracing>

<!-- Accepted values are:
none - disable tracing completely (the default)
basic - log marshal method function enter/leave messages
full - like 'basic' but also include stack traces at the entry to a marshal method
-->
<_AndroidMarshalMethodsTracingMode Condition=" '$(_AndroidMarshalMethodsTracingMode)' == '' ">none</_AndroidMarshalMethodsTracingMode>
</PropertyGroup>

<!-- Do not resolve from the GAC under any circumstances in Mobile -->
Expand Down Expand Up @@ -1792,7 +1798,7 @@ because xbuild doesn't support framework reference assemblies.
UsingAndroidNETSdk="$(UsingAndroidNETSdk)"
UseAssemblyStore="$(AndroidUseAssemblyStore)"
EnableMarshalMethods="$(_AndroidUseMarshalMethods)"
EnableMarshalMethodTracing="$(_AndroidEnableMarshalMethodTracing)"
MarshalMethodsTracingMode="$(_AndroidMarshalMethodsTracingMode)"
>
<Output TaskParameter="BuildId" PropertyName="_XamarinBuildId" />
</GeneratePackageManagerJava>
Expand Down Expand Up @@ -2087,7 +2093,7 @@ because xbuild doesn't support framework reference assemblies.
ApplicationSharedLibraries="@(_ApplicationSharedLibrary)"
DebugBuild="$(AndroidIncludeDebugSymbols)"
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
EnableMarshalMethodTracing="$(_AndroidEnableMarshalMethodTracing)"
MarshalMethodsTracingMode="$(_AndroidMarshalMethodsTracingMode)"
/>
<ItemGroup>
<FileWrites Include="@(_ApplicationSharedLibrary)" />
Expand Down
2 changes: 1 addition & 1 deletion src/monodroid/jni/application_dso_stub.cc
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ const MarshalMethodName mm_method_names[] = {
},
};

void xamarin_app_init ([[maybe_unused]] get_function_pointer_fn fn) noexcept
void xamarin_app_init ([[maybe_unused]] JNIEnv *env, [[maybe_unused]] get_function_pointer_fn fn) noexcept
{
// Dummy
}
Expand Down
Loading