Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
060ffd3
NativeAOT Android test working locally
jtschuster Jul 21, 2025
a3d30c1
Undo extra changes, add reference in tests.proj
jtschuster Jul 24, 2025
ae6a9ce
Remove emtpy 'if' case
jtschuster Jul 24, 2025
5797ccc
Merge branch 'main' of https://github.com/dotnet/runtime into Android…
jtschuster Jul 24, 2025
68b972a
Remove extra android->linux translations
jtschuster Jul 24, 2025
044b176
Remove redundant IsNativeAOT check
jtschuster Jul 25, 2025
d74d3ec
Fix build to work in CI
jtschuster Jul 28, 2025
ce32f11
Merge branch 'main' of https://github.com/dotnet/runtime into Android…
jtschuster Jul 28, 2025
87a4cca
Fix apkbuilder.cs errors after merge
jtschuster Jul 28, 2025
8de0a57
Undo deleted line in ILC.targets, build libs.tests in pipeline
jtschuster Jul 28, 2025
36dfe61
Add missing args to build command
jtschuster Jul 28, 2025
152ec03
Set CppCompilerAndLinker to NDK clang when targeting android
jtschuster Jul 28, 2025
0facf06
Ensure Android build runs after CopyNativeBinary
jtschuster Jul 28, 2025
407b4db
Merge branch 'main' into AndroidAppBuilderNaot
jtschuster Jul 28, 2025
5e7feaa
Test CI in Debug config
jtschuster Jul 30, 2025
56553a7
Merge branch 'main' into AndroidAppBuilderNaot
jtschuster Jul 30, 2025
3c86a91
Move leg to runtime-extra-platforms
jtschuster Jul 30, 2025
28600f9
Merge branch 'AndroidAppBuilderNaot' of https://github.com/jtschuster…
jtschuster Jul 30, 2025
05deb8f
Remove jobs from runtime
jtschuster Jul 30, 2025
248dddd
Exclude nativeaot test on non-nativeaot builds
jtschuster Jul 30, 2025
54b995d
Add thread.inl to interoplibinterface_java.cpp to fix loadLibrary fai…
jtschuster Jul 31, 2025
b7e58a1
Remove android rids from targetpack rids
jtschuster Jul 31, 2025
7e98286
Run release build in CI
jtschuster Jul 31, 2025
972719a
Use AppBundle as AndroidBundleDir as Helix expects
jtschuster Jul 31, 2025
d8ac52a
Merge branch 'main' into AndroidAppBuilderNaot
jtschuster Jul 31, 2025
0e306b2
Tighten OutputType condition in singlefile test targets
jtschuster Jul 31, 2025
2b93e83
Add job to runtime-extra-platforms-androidemulator.yml
jtschuster Aug 4, 2025
7137d36
Update CrossCompileAbi condition
jtschuster Aug 4, 2025
fcbbd79
Merge branch 'AndroidAppBuilderNaot' of https://github.com/jtschuster…
jtschuster Aug 4, 2025
b84c294
Update src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Nativ…
jtschuster Aug 4, 2025
904d59d
Use UseNativeAOTRuntime property to test if using nativeaot instead o…
jtschuster Aug 4, 2025
6a7b918
DirectPInvoke and DirectPInvokeList is not plural in naot
jtschuster Aug 4, 2025
1b05d92
Merge branch 'AndroidAppBuilderNaot' of https://github.com/jtschuster…
jtschuster Aug 4, 2025
5a0413b
Add null checks in JNI code
jtschuster Aug 5, 2025
222b805
Condition CoreCLR tests on the build not being for NativeAOT
jtschuster Aug 5, 2025
b61f83c
Run android tests unconditionally in extra-platforms builds
jtschuster Aug 5, 2025
ef83aa7
Copy Java files to publish dir, don't search for them in build dir
jtschuster Aug 6, 2025
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
4 changes: 2 additions & 2 deletions eng/targetingpacks.targets
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,14 @@
RuntimeFrameworkName="$(LocalFrameworkOverrideName)"
LatestRuntimeFrameworkVersion="$(ProductVersion)"
RuntimePackNamePatterns="$(LocalFrameworkOverrideName).Runtime.NativeAOT.**RID**"
RuntimePackRuntimeIdentifiers="ios-arm64;iossimulator-arm64;iossimulator-x64;tvos-arm64;tvossimulator-arm64;tvossimulator-x64;maccatalyst-arm64;maccatalyst-x64;linux-bionic-arm64;linux-bionic-x64;osx-arm64;osx-x64"
RuntimePackRuntimeIdentifiers="ios-arm64;iossimulator-arm64;iossimulator-x64;tvos-arm64;tvossimulator-arm64;tvossimulator-x64;maccatalyst-arm64;maccatalyst-x64;linux-bionic-arm64;linux-bionic-x64;android-x64;android-arm64;osx-arm64;osx-x64"
RuntimePackLabels="NativeAOT"
Condition="'$(UseLocalTargetingRuntimePack)' == 'true' and ('@(KnownRuntimePack)' == '' or @(KnownRuntimePack->WithMetadataValue('Identity', 'Microsoft.NETCore.App')->WithMetadataValue('RuntimePackLabels', 'NativeAOT')->WithMetadataValue('TargetFramework', '$(NetCoreAppCurrent)')) == '')" />
<KnownILCompilerPack Include="Microsoft.DotNet.ILCompiler"
ILCompilerPackNamePattern="runtime.**RID**.Microsoft.DotNet.ILCompiler"
TargetFramework="$(NetCoreAppCurrent)"
ILCompilerPackVersion="$(ProductVersion)"
ILCompilerRuntimeIdentifiers="linux-musl-x64;linux-x64;win-x64;linux-arm;linux-arm64;linux-musl-arm;linux-musl-arm64;osx-arm64;osx-x64;win-arm64;win-x86;linux-riscv64;linux-musl-riscv64;linux-loongarch64;linux-musl-loongarch64"
ILCompilerRuntimeIdentifiers="linux-musl-x64;linux-x64;win-x64;linux-arm;linux-arm64;linux-musl-arm;linux-musl-arm64;osx-arm64;osx-x64;win-arm64;win-x86;linux-riscv64;linux-musl-riscv64;linux-loongarch64;linux-musl-loongarch64;android-x64;linux-bionic-x64;android-arm64;linux-bionic-arm64"
Condition="'$(UseLocalILCompilerPack)' == 'true' and '@(KnownILCompilerPack->AnyHaveMetadataValue('TargetFramework', '$(NetCoreAppCurrent)'))' != 'true'" />
<KnownCrossgen2Pack Include="$(LocalFrameworkOverrideName).Crossgen2"
TargetFramework="$(NetCoreAppCurrent)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<_targetOS>$(_originalTargetOS)</_targetOS>
<_linuxToken>linux-</_linuxToken>
<_linuxLibcFlavor Condition="$(_targetOS.StartsWith($(_linuxToken)))">$(_targetOS.SubString($(_linuxToken.Length)))</_linuxLibcFlavor>
<_targetOS Condition="$(_targetOS.StartsWith($(_linuxToken)))">linux</_targetOS>
<_linuxLibcFlavor Condition="'$(_targetOS)' == 'android'">bionic</_linuxLibcFlavor>

<!-- linux-bionic on ARM uses armel (softfp) ABI -->
<_targetArchitectureWithAbi>$(_targetArchitecture)</_targetArchitectureWithAbi>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ The .NET Foundation licenses this file to you under the MIT license.
<CrossCompileArch Condition="$(CrossCompileRid.EndsWith('-arm'))">armv7</CrossCompileArch>

<CrossCompileAbi>gnu</CrossCompileAbi>
<CrossCompileAbi Condition="$(CrossCompileRid.StartsWith('linux-bionic-'))">android21</CrossCompileAbi>
<CrossCompileAbi Condition="$(CrossCompileRid.StartsWith('linux-bionic-')) or $(CrossCompileRid.StartsWith('android'))">android21</CrossCompileAbi>
<CrossCompileAbi Condition="$(CrossCompileRid.StartsWith('linux-musl-')) or $(CrossCompileRid.StartsWith('alpine-'))">musl</CrossCompileAbi>
<CrossCompileAbi Condition="'$(CrossCompileRid)' == 'linux-arm'">gnueabihf</CrossCompileAbi>
<CrossCompileAbi Condition="'$(CrossCompileRid)' == 'linux-bionic-arm'">androideabi21</CrossCompileAbi>
Expand Down
5 changes: 5 additions & 0 deletions src/libraries/tests.proj
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,11 @@
BuildInParallel="false" />
</ItemGroup>

<ItemGroup Condition="'$(TargetOS)' == 'android' and '$(RuntimeFlavor)' == 'NativeAOT'">
<ProjectReference Include="$(RepoRoot)\src\tests\FunctionalTests\Android\Device_Emulator\NativeAOT\Android.Device_Emulator.NativeAOT.Test.csproj"
BuildInParallel="false" />
</ItemGroup>

<PropertyGroup>
<Samples_BuildInParallel Condition="'$(OS)' == 'Windows_NT'">false</Samples_BuildInParallel>
<!-- prompted by https://github.com/dotnet/dnceng/issues/450 -->
Expand Down
3 changes: 2 additions & 1 deletion src/mono/msbuild/android/build/AndroidBuild.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<RuntimeIdentifier>$(TargetOS)-$(TargetArchitecture.ToLowerInvariant())</RuntimeIdentifier>
<!-- TODO: Revisit this.
We need to check for RuntimeFlavor setting as for runtime tests we always import CoreCLR props which force UseMonoRuntime=false (see: https://github.com/dotnet/runtime/issues/111919) -->
<UseMonoRuntime Condition="'$(RuntimeFlavor)' == 'coreclr'">false</UseMonoRuntime>
<UseMonoRuntime Condition="'$(RuntimeFlavor)' == 'coreclr' or '$(RuntimeFlavor)' == 'nativeaot'">false</UseMonoRuntime>
<UseMonoRuntime Condition="'$(UseMonoRuntime)' == '' or '$(RuntimeFlavor)' == 'mono'">true</UseMonoRuntime>
<UseMonoJustInterp Condition="'$(UseMonoRuntime)' == 'true' and '$(RunAOTCompilation)' == 'true' and '$(MonoForceInterpreter)' == 'true'">true</UseMonoJustInterp>

Expand All @@ -14,6 +14,7 @@
<_IsLibraryMode Condition="'$(UseMonoRuntime)' == 'true' and '$(UseNativeAOTRuntime)' != 'true' and '$(NativeLib)' != ''">true</_IsLibraryMode>
<_ReadRuntimeComponentsManifestTargetName Condition="'$(UseMonoRuntime)' == 'true' and '$(UseNativeAOTRuntime)' != 'true'">_MonoReadAvailableComponentsManifest</_ReadRuntimeComponentsManifestTargetName>

<StaticLinkedRuntime Condition="'$(RuntimeFlavor)' == 'nativeaot'">false</StaticLinkedRuntime>
<StaticLinkedRuntime Condition="'$(RuntimeFlavor)' == 'coreclr' and '$(StaticLinkedRuntime)' == ''">false</StaticLinkedRuntime>

<AndroidBuildAfterThisTarget Condition="'$(AndroidBuildAfterThisTarget)' == ''">Publish</AndroidBuildAfterThisTarget>
Expand Down
3 changes: 3 additions & 0 deletions src/mono/msbuild/android/build/AndroidBuild.targets
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@
We are using a private property to determine the target runtime, we should instead unify the resolution with Apple targets instead, (see: https://github.com/dotnet/runtime/issues/111923) -->
<_RuntimeFlavor>Mono</_RuntimeFlavor>
<_RuntimeFlavor Condition="'$(UseMonoRuntime)' == 'false' and '$(UseNativeAOTRuntime)' != 'true'">CoreCLR</_RuntimeFlavor>
<_RuntimeFlavor Condition="'$(UseNativeAOTRuntime)' == 'true'">nativeaot</_RuntimeFlavor>
</PropertyGroup>

<AndroidAppBuilderTask
Expand Down Expand Up @@ -290,4 +291,6 @@
RuntimeConfigReservedProperties="@(_RuntimeConfigReservedProperties)">
</RuntimeConfigParserTask>
</Target>

<Import Project="$(CoreCLRBuildIntegrationDir)Microsoft.DotNet.ILCompiler.SingleEntry.targets" Condition="'$(UseNativeAOTRuntime)' == 'true'" />
</Project>
148 changes: 87 additions & 61 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
public enum RuntimeFlavorEnum
{
Mono,
CoreCLR
CoreCLR,
NativeAOT
}

public partial class ApkBuilder
Expand Down Expand Up @@ -52,6 +53,7 @@ public partial class ApkBuilder
private RuntimeFlavorEnum parsedRuntimeFlavor;
private bool IsMono => parsedRuntimeFlavor == RuntimeFlavorEnum.Mono;
private bool IsCoreCLR => parsedRuntimeFlavor == RuntimeFlavorEnum.CoreCLR;
private bool IsNativeAOT => parsedRuntimeFlavor == RuntimeFlavorEnum.NativeAOT;

private TaskLoggingHelper logger;

Expand Down Expand Up @@ -90,7 +92,8 @@ public ApkBuilder(TaskLoggingHelper logger)
throw new ArgumentException($"ProjectName='{ProjectName}' should not not contain spaces.");
}

if (string.IsNullOrEmpty(AndroidSdk)){
if (string.IsNullOrEmpty(AndroidSdk))
{
AndroidSdk = Environment.GetEnvironmentVariable("ANDROID_SDK_ROOT");
}

Expand Down Expand Up @@ -153,7 +156,7 @@ public ApkBuilder(TaskLoggingHelper logger)
var assemblerFilesToLink = new StringBuilder();
var aotLibraryFiles = new List<string>();

if (!IsLibraryMode)
if (!(IsLibraryMode || IsNativeAOT))
{
foreach (ITaskItem file in Assemblies)
{
Expand Down Expand Up @@ -243,7 +246,7 @@ public ApkBuilder(TaskLoggingHelper logger)
{
nativeLibraries = string.Join("\n ", NativeDependencies.Select(dep => dep));
}
else
else if (!IsNativeAOT)
{
string runtimeLib = "";
if (StaticLinkedRuntime && IsMono)
Expand All @@ -263,7 +266,7 @@ public ApkBuilder(TaskLoggingHelper logger)
runtimeLib = Path.Combine(AppDir, "libcoreclr.so");
}

if (!File.Exists(runtimeLib))
if (!File.Exists(runtimeLib) && !IsNativeAOT)
{
throw new ArgumentException($"{runtimeLib} was not found");
}
Expand Down Expand Up @@ -324,72 +327,79 @@ public ApkBuilder(TaskLoggingHelper logger)
nativeLibraries += $" libc++_static.a{Environment.NewLine}";
}
}

StringBuilder extraLinkerArgs = new StringBuilder();
foreach (ITaskItem item in ExtraLinkerArguments)
string abi;
if (IsNativeAOT)
{
extraLinkerArgs.AppendLine($" \"{item.ItemSpec}\"");
abi = AndroidProject.DetermineAbi(runtimeIdentifier);
}

if (StaticLinkedRuntime && IsCoreCLR)
else
{
// Ensure global symbol references in the shared library are resolved to definitions in
// the same shared library. For the static linked runtime specifically, we need this for
// global functions in assembly for the linker to treat relative offsets to them as constant
extraLinkerArgs.AppendLine($" \"-Wl,-Bsymbolic\"");
}
StringBuilder extraLinkerArgs = new StringBuilder();
foreach (ITaskItem item in ExtraLinkerArguments)
{
extraLinkerArgs.AppendLine($" \"{item.ItemSpec}\"");
}

nativeLibraries += assemblerFilesToLink.ToString();
if (StaticLinkedRuntime && IsCoreCLR)
{
// Ensure global symbol references in the shared library are resolved to definitions in
// the same shared library. For the static linked runtime specifically, we need this for
// global functions in assembly for the linker to treat relative offsets to them as constant
extraLinkerArgs.AppendLine($" \"-Wl,-Bsymbolic\"");
}

string aotSources = assemblerFiles.ToString();
string monodroidSource = IsCoreCLR ?
"monodroid-coreclr.c" : (IsLibraryMode) ? "monodroid-librarymode.c" : "monodroid.c";
string runtimeInclude = string.Join(" ", runtimeHeaders.Select(h => $"\"{NormalizePathToUnix(h)}\""));
nativeLibraries += assemblerFilesToLink.ToString();

string cmakeLists = Utils.GetEmbeddedResource("CMakeLists-android.txt")
.Replace("%RuntimeInclude%", runtimeInclude)
.Replace("%NativeLibrariesToLink%", NormalizePathToUnix(nativeLibraries))
.Replace("%MONODROID_SOURCE%", monodroidSource)
.Replace("%AotSources%", NormalizePathToUnix(aotSources))
.Replace("%AotModulesSource%", string.IsNullOrEmpty(aotSources) ? "" : "modules.c")
.Replace("%APP_LINKER_ARGS%", extraLinkerArgs.ToString());
string aotSources = assemblerFiles.ToString();
string monodroidSource = IsCoreCLR ?
"monodroid-coreclr.c" : (IsLibraryMode) ? "monodroid-librarymode.c" : "monodroid.c";
string runtimeInclude = string.Join(" ", runtimeHeaders.Select(h => $"\"{NormalizePathToUnix(h)}\""));

var defines = new StringBuilder();
if (ForceInterpreter)
{
defines.AppendLine("add_definitions(-DFORCE_INTERPRETER=1)");
}
else if (ForceAOT)
{
defines.AppendLine("add_definitions(-DFORCE_AOT=1)");
if (aotLibraryFiles.Count == 0)
string cmakeLists = Utils.GetEmbeddedResource("CMakeLists-android.txt")
.Replace("%RuntimeInclude%", runtimeInclude)
.Replace("%NativeLibrariesToLink%", NormalizePathToUnix(nativeLibraries))
.Replace("%MONODROID_SOURCE%", monodroidSource)
.Replace("%AotSources%", NormalizePathToUnix(aotSources))
.Replace("%AotModulesSource%", string.IsNullOrEmpty(aotSources) ? "" : "modules.c")
.Replace("%APP_LINKER_ARGS%", extraLinkerArgs.ToString());

var defines = new StringBuilder();
if (ForceInterpreter)
{
defines.AppendLine("add_definitions(-DSTATIC_AOT=1)");
defines.AppendLine("add_definitions(-DFORCE_INTERPRETER=1)");
}
else if (ForceAOT)
{
defines.AppendLine("add_definitions(-DFORCE_AOT=1)");
if (aotLibraryFiles.Count == 0)
{
defines.AppendLine("add_definitions(-DSTATIC_AOT=1)");
}
}
}

if (ForceFullAOT)
{
defines.AppendLine("add_definitions(-DFULL_AOT=1)");
}
if (ForceFullAOT)
{
defines.AppendLine("add_definitions(-DFULL_AOT=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("add_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}
if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("add_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());
cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
File.WriteAllText(Path.Combine(OutputDir, monodroidSource), Utils.GetEmbeddedResource(monodroidSource));
File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
File.WriteAllText(Path.Combine(OutputDir, monodroidSource), Utils.GetEmbeddedResource(monodroidSource));

AndroidProject project = new AndroidProject("monodroid", runtimeIdentifier, AndroidNdk, logger);
project.GenerateCMake(OutputDir, MinApiLevel, StripDebugSymbols);
project.BuildCMake(OutputDir, StripDebugSymbols);
AndroidProject project = new AndroidProject("monodroid", runtimeIdentifier, AndroidNdk, logger);
project.GenerateCMake(OutputDir, MinApiLevel, StripDebugSymbols);
project.BuildCMake(OutputDir, StripDebugSymbols);

// TODO: https://github.com/dotnet/runtime/issues/115717
// TODO: https://github.com/dotnet/runtime/issues/115717

string abi = project.Abi;
abi = project.Abi;
}

// 2. Compile Java files

Expand Down Expand Up @@ -423,11 +433,22 @@ public ApkBuilder(TaskLoggingHelper logger)
envVariables += $"\t\tsetEnv(\"{name}\", \"{value}\");\n";
}

string jniLibraryName = (IsLibraryMode) ? ProjectName! :
(StaticLinkedRuntime && IsCoreCLR) ? "monodroid" : "System.Security.Cryptography.Native.Android";
string jniLibraryName;
if (IsLibraryMode || IsNativeAOT)
jniLibraryName = ProjectName!;
else if (StaticLinkedRuntime && IsCoreCLR)
jniLibraryName = "monodroid";
else
jniLibraryName = "System.Security.Cryptography.Native.Android";

List<string> librariesToLoad = [jniLibraryName];
if (!IsNativeAOT)
librariesToLoad.Add("monodroid");

string monoRunner = Utils.GetEmbeddedResource("MonoRunner.java")
.Replace("%EntryPointLibName%", Path.GetFileName(mainLibraryFileName))
.Replace("%JNI_LIBRARY_NAME%", jniLibraryName)
.Replace("%LoadLibraryStatements%",
string.Join('\n', librariesToLoad.Select(l => $"System.loadLibrary(\"{l}\");")))
.Replace("%EnvVariables%", envVariables);

File.WriteAllText(monoRunnerPath, monoRunner);
Expand All @@ -448,8 +469,13 @@ public ApkBuilder(TaskLoggingHelper logger)

if (classFiles.Length == 0)
throw new InvalidOperationException("Didn't find any .class files");
List<string> inputFiles = [.. classFiles];
if (IsNativeAOT)
{
inputFiles.Add(Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(AppDir)!)!, "libSystem.Security.Cryptography.Native.Android.jar"));
}

Utils.RunProcess(logger, androidSdkHelper.D8Path, $"--no-desugaring {string.Join(" ", classFiles)}", workingDir: OutputDir);
Utils.RunProcess(logger, androidSdkHelper.D8Path, $"--no-desugaring {string.Join(" ", inputFiles)}", workingDir: OutputDir);
}
else
{
Expand All @@ -463,7 +489,8 @@ public ApkBuilder(TaskLoggingHelper logger)
Utils.RunProcess(logger, androidSdkHelper.AaptPath, $"package -f -m -F {apkFile} -A assets -M AndroidManifest.xml -I {androidJar} {debugModeArg}", workingDir: OutputDir);

var dynamicLibs = new List<string>();
dynamicLibs.Add(Path.Combine(OutputDir, "monodroid", "libmonodroid.so"));
if (!IsNativeAOT)
dynamicLibs.Add(Path.Combine(OutputDir, "monodroid", "libmonodroid.so"));

if (IsLibraryMode)
{
Expand Down Expand Up @@ -526,7 +553,6 @@ public ApkBuilder(TaskLoggingHelper logger)
}

// NOTE: we can run android-strip tool from NDK to shrink native binaries here even more.

File.Copy(dynamicLib, Path.Combine(OutputDir, destRelative), true);
Utils.RunProcess(logger, androidSdkHelper.AaptPath, $"add {apkFile} {NormalizePathToUnix(destRelative)}", workingDir: OutputDir);
}
Expand Down
3 changes: 1 addition & 2 deletions src/tasks/AndroidAppBuilder/Templates/MonoRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ public class MonoRunner extends Instrumentation
{
static {
// loadLibrary triggers JNI_OnLoad in these libs
System.loadLibrary("%JNI_LIBRARY_NAME%");
System.loadLibrary("monodroid");
%LoadLibraryStatements%
}

static String testResultsDir;
Expand Down
Loading
Loading