Skip to content

Commit f77a717

Browse files
committed
split init runtime and execute entry point
1 parent b61c8fc commit f77a717

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

src/tasks/AndroidAppBuilder/Templates/MainActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ protected void onCreate(Bundle savedInstanceState)
4141
}
4242

4343
final Activity ctx = this;
44+
MonoRunner.initializeRuntime(ctx);
4445
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
4546
@Override
4647
public void run() {
47-
int retcode = MonoRunner.initialize(entryPointLibName, new String[0], ctx);
48+
int retcode = MonoRunner.executeEntryPoint(entryPointLibName, new String[0]); // add post delayed handler
4849
textView.setText("Mono Runtime returned: " + retcode);
4950
}
5051
}, 1000);

src/tasks/AndroidAppBuilder/Templates/MonoRunner.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void onCreate(Bundle arguments) {
7474
start();
7575
}
7676

77-
public static int initialize(String entryPointLibName, String[] args, Context context) {
77+
public static void initializeRuntime(Context context) {
7878
String filesDir = context.getFilesDir().getAbsolutePath();
7979
String cacheDir = context.getCacheDir().getAbsolutePath();
8080

@@ -90,9 +90,13 @@ public static int initialize(String entryPointLibName, String[] args, Context co
9090
// unzip libs and test files to filesDir
9191
unzipAssets(context, filesDir, "assets.zip");
9292

93-
Log.i("DOTNET", "MonoRunner initialize,, entryPointLibName=" + entryPointLibName);
93+
Log.i("DOTNET", "MonoRunner initializeRuntime,, entryPointLibName=" + entryPointLibName);
9494
int localDateTimeOffset = getLocalDateTimeOffset();
95-
return initRuntime(filesDir, cacheDir, testResultsDir, entryPointLibName, args, localDateTimeOffset);
95+
initRuntime(filesDir, cacheDir, testResultsDir, localDateTimeOffset);
96+
}
97+
98+
public static int executeEntryPoint(String entryPointLibName, String[] args) {
99+
return execEntryPoint(entryPointLibName, args);
96100
}
97101

98102
@Override
@@ -104,7 +108,9 @@ public void onStart() {
104108
finish(1, null);
105109
return;
106110
}
107-
int retcode = initialize(entryPointLibName, argsToForward, getContext());
111+
112+
initializeRuntime(getContext());
113+
int retcode = executeEntryPoint(entryPointLibName, argsToForward);
108114

109115
Log.i("DOTNET", "MonoRunner finished, return-code=" + retcode);
110116
result.putInt("return-code", retcode);
@@ -162,7 +168,9 @@ static int getLocalDateTimeOffset() {
162168
}
163169
}
164170

165-
static native int initRuntime(String libsDir, String cacheDir, String testResultsDir, String entryPointLibName, String[] args, int local_date_time_offset);
171+
static native void initRuntime(String libsDir, String cacheDir, String testResultsDir, int local_date_time_offset);
172+
173+
static native int execEntryPoint(String entryPointLibName, String[] args);
166174

167175
static native int setEnv(String key, String value);
168176
}

src/tasks/AndroidAppBuilder/Templates/monodroid.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@
3333
void
3434
Java_net_dot_MonoRunner_setEnv (JNIEnv* env, jobject thiz, jstring j_key, jstring j_value);
3535

36+
void
37+
Java_net_dot_MonoRunner_initRuntime (JNIEnv* env, jobject thiz, jstring j_files_dir, jstring j_cache_dir, jstring j_testresults_dir, long current_local_time);
38+
3639
int
37-
Java_net_dot_MonoRunner_initRuntime (JNIEnv* env, jobject thiz, jstring j_files_dir, jstring j_cache_dir, jstring j_testresults_dir, jstring j_entryPointLibName, jobjectArray j_args, long current_local_time);
40+
Java_net_dot_MonoRunner_execEntryPoint (JNIEnv* env, jobject thiz, jstring j_entryPointLibName, jobjectArray j_args);
3841

3942
// called from C#
4043
void
@@ -221,8 +224,8 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
221224
free (user_data);
222225
}
223226

224-
static int
225-
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[], int local_date_time_offset)
227+
static void
228+
mono_droid_runtime_init (int local_date_time_offset)
226229
{
227230
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj
228231

@@ -304,7 +307,11 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
304307
mono_jit_set_aot_mode(MONO_AOT_MODE_NORMAL);
305308
#endif // FULL_AOT
306309
#endif // FORCE_INTERPRETER
310+
}
307311

312+
static int
313+
mono_droid_execute_assembly (const char *executable, int managed_argc, char* managed_argv[])
314+
{
308315
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
309316
assert (domain);
310317

@@ -340,37 +347,48 @@ Java_net_dot_MonoRunner_setEnv (JNIEnv* env, jobject thiz, jstring j_key, jstrin
340347
(*env)->ReleaseStringUTFChars(env, j_value, val);
341348
}
342349

343-
int
344-
Java_net_dot_MonoRunner_initRuntime (JNIEnv* env, jobject thiz, jstring j_files_dir, jstring j_cache_dir, jstring j_testresults_dir, jstring j_entryPointLibName, jobjectArray j_args, long current_local_time)
350+
void
351+
Java_net_dot_MonoRunner_initRuntime (JNIEnv* env, jobject thiz, jstring j_files_dir, jstring j_cache_dir, jstring j_testresults_dir, long current_local_time)
345352
{
346353
char file_dir[2048];
347354
char cache_dir[2048];
348355
char testresults_dir[2048];
349-
char entryPointLibName[2048];
350356
strncpy_str (env, file_dir, j_files_dir, sizeof(file_dir));
351357
strncpy_str (env, cache_dir, j_cache_dir, sizeof(cache_dir));
352358
strncpy_str (env, testresults_dir, j_testresults_dir, sizeof(testresults_dir));
353-
strncpy_str (env, entryPointLibName, j_entryPointLibName, sizeof(entryPointLibName));
354359

355360
bundle_path = file_dir;
356-
executable = entryPointLibName;
357361

358362
setenv ("HOME", bundle_path, true);
359363
setenv ("TMPDIR", cache_dir, true);
360364
setenv ("TEST_RESULTS_DIR", testresults_dir, true);
361365

366+
mono_droid_runtime_init (current_local_time);
367+
}
368+
369+
int
370+
Java_net_dot_MonoRunner_execEntryPoint (JNIEnv* env, jobject thiz, jstring j_entryPointLibName, jobjectArray j_args)
371+
{
372+
char entryPointLibName[2048];
373+
strncpy_str (env, entryPointLibName, j_entryPointLibName, sizeof(entryPointLibName));
374+
375+
executable = entryPointLibName;
376+
assert (executable);
377+
362378
int args_len = (*env)->GetArrayLength(env, j_args);
363379
int managed_argc = args_len + 1;
364380
char** managed_argv = (char**)malloc(managed_argc * sizeof(char*));
365381

382+
bundle_path = getenv ("HOME");
383+
assert (bundle_path); // "HOME" env variable must be set by Java_net_dot_MonoRunner_initRuntime
366384
managed_argv[0] = bundle_path;
367385
for (int i = 0; i < args_len; ++i)
368386
{
369387
jstring j_arg = (*env)->GetObjectArrayElement(env, j_args, i);
370388
managed_argv[i + 1] = (char*)((*env)->GetStringUTFChars(env, j_arg, NULL));
371389
}
372390

373-
int res = mono_droid_runtime_init (executable, managed_argc, managed_argv, current_local_time);
391+
int res = mono_droid_execute_assembly (executable, managed_argc, managed_argv);
374392

375393
for (int i = 0; i < args_len; ++i)
376394
{

0 commit comments

Comments
 (0)