Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ run-android: $(ATESTS)
run-test-jnimarshal: bin/Test$(CONFIGURATION)/Java.Interop.Export-Tests.dll bin/Test$(CONFIGURATION)/$(JAVA_INTEROP_LIB)
MONO_TRACE_LISTENER=Console.Out \
$(RUNTIME) bin/$(CONFIGURATION)/jnimarshalmethod-gen.exe -v -L $(JI_MONO_LIB_PATH)mono/4.5 -L $(JI_MONO_LIB_PATH)mono/4.5/Facades "$<"
$(RM) "$(basename $<)-JniMarshalMethods.dll"
$(call RUN_TEST,$<)


Expand Down
60 changes: 46 additions & 14 deletions tools/jnimarshalmethod-gen/App.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,36 @@

namespace Xamarin.Android.Tools.JniMarshalMethodGenerator {

class App
class App : MarshalByRefObject
{

internal const string Name = "jnimarshalmethod-gen";
static DirectoryAssemblyResolver resolver = new DirectoryAssemblyResolver (logger: (l, v) => { Console.WriteLine (v); }, loadDebugSymbols: true, loadReaderParameters: new ReaderParameters () { ReadSymbols = true });
static Dictionary<string, TypeBuilder> definedTypes = new Dictionary<string, TypeBuilder> ();
static public bool Debug;
static public bool Verbose;
static bool keepTemporary;
static List<Regex> typeNameRegexes = new List<Regex> ();
List<string> FilesToDelete = new List<string> ();

public static int Main (string [] args)
{
var domain = AppDomain.CreateDomain ("workspace");
var app = (App)domain.CreateInstanceAndUnwrap (typeof (App).Assembly.FullName, typeof (App).FullName);

var assemblies = app.ProcessArguments (args);
app.ProcessAssemblies (assemblies);
var filesToDelete = app.FilesToDelete;

AppDomain.Unload (domain);

foreach (var path in filesToDelete)
File.Delete (path);

return 0;
}

List<string> ProcessArguments (string [] args)
{
var help = false;
var options = new OptionSet {
Expand All @@ -39,6 +58,9 @@ public static int Main (string [] args)
{ "d|debug",
"Inject debug messages",
v => Debug = true },
{ "keeptemp",
"Keep temporary *-JniMarshalMethod.dll files.",
v => keepTemporary = true },
{ "L=",
"{DIRECTORY} to resolve assemblies from.",
v => resolver.SearchDirectories.Add (v) },
Expand All @@ -53,24 +75,35 @@ public static int Main (string [] args)
v => Verbose = true },
};

var jvm = CreateJavaVM ();

var assemblies = options.Parse (args);
if (help) {
if (help || args.Length < 1) {
options.WriteOptionDescriptions (Console.Out);

return 0;
Environment.Exit (0);
}

if (assemblies.Count < 1) {
Error ("Please specify at least one ASSEMBLY to process.");
Environment.Exit (2);
}

return assemblies;
}

void ProcessAssemblies (List<string> assemblies)
{
CreateJavaVM ();

var readWriteParameters = new ReaderParameters {
AssemblyResolver = resolver,
ReadSymbols = true,
ReadWrite = true,
};

foreach (var assembly in assemblies) {
if (!File.Exists (assembly)) {
Error ($"Path '{assembly}' does not exist.");
return 1;
Environment.Exit (1);
}

resolver.SearchDirectories.Add (Path.GetDirectoryName (assembly));
Expand All @@ -81,19 +114,15 @@ public static int Main (string [] args)
CreateMarshalMethodAssembly (assembly);
} catch (Exception e) {
Error ($"Unable to process assembly '{assembly}'\n{e.Message}\n{e}");
return 1;
Environment.Exit (1);
}
}

jvm.Dispose ();

return 0;
}

static JniRuntime CreateJavaVM ()
void CreateJavaVM ()
{
var builder = new JreRuntimeOptions ();
return builder.CreateJreVM ();
builder.CreateJreVM ();
}

static JniRuntime.JniMarshalMemberBuilder CreateExportedMemberBuilder ()
Expand All @@ -119,7 +148,7 @@ static TypeBuilder GetTypeBuilder (ModuleBuilder mb, Type type)
return tb;
}

static void CreateMarshalMethodAssembly (string path)
void CreateMarshalMethodAssembly (string path)
{
var assembly = Assembly.LoadFile (path);

Expand Down Expand Up @@ -237,6 +266,9 @@ static void CreateMarshalMethodAssembly (string path)
var dstAssembly = resolver.GetAssembly (destPath);
var mover = new TypeMover (dstAssembly, ad, definedTypes, resolver);
mover.Move ();

if (!keepTemporary)
FilesToDelete.Add (dstAssembly.MainModule.FileName);
}

static readonly MethodInfo Delegate_CreateDelegate = typeof (Delegate).GetMethod ("CreateDelegate", new[] {
Expand Down