Skip to content
Merged
3 changes: 2 additions & 1 deletion src/tasks/AndroidAppBuilder/Templates/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,11 @@ protected void onCreate(Bundle savedInstanceState)
}

final Activity ctx = this;
MonoRunner.initializeRuntime(ctx);
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
int retcode = MonoRunner.initialize(entryPointLibName, new String[0], ctx);
int retcode = MonoRunner.executeEntryPoint(entryPointLibName, new String[0]);
textView.setText("Mono Runtime returned: " + retcode);
}
}, 1000);
Expand Down
18 changes: 13 additions & 5 deletions src/tasks/AndroidAppBuilder/Templates/MonoRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public void onCreate(Bundle arguments) {
start();
}

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

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

Log.i("DOTNET", "MonoRunner initialize,, entryPointLibName=" + entryPointLibName);
Log.i("DOTNET", "MonoRunner initializeRuntime,, entryPointLibName=" + entryPointLibName);
int localDateTimeOffset = getLocalDateTimeOffset();
return initRuntime(filesDir, cacheDir, testResultsDir, entryPointLibName, args, localDateTimeOffset);
initRuntime(filesDir, cacheDir, testResultsDir, localDateTimeOffset);
}

public static int executeEntryPoint(String entryPointLibName, String[] args) {
return execEntryPoint(entryPointLibName, args);
}

@Override
Expand All @@ -104,7 +108,9 @@ public void onStart() {
finish(1, null);
return;
}
int retcode = initialize(entryPointLibName, argsToForward, getContext());

initializeRuntime(getContext());
int retcode = executeEntryPoint(entryPointLibName, argsToForward);

Log.i("DOTNET", "MonoRunner finished, return-code=" + retcode);
result.putInt("return-code", retcode);
Expand Down Expand Up @@ -162,7 +168,9 @@ static int getLocalDateTimeOffset() {
}
}

static native int initRuntime(String libsDir, String cacheDir, String testResultsDir, String entryPointLibName, String[] args, int local_date_time_offset);
static native void initRuntime(String libsDir, String cacheDir, String testResultsDir, int local_date_time_offset);

static native int execEntryPoint(String entryPointLibName, String[] args);

static native int setEnv(String key, String value);
}
36 changes: 27 additions & 9 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@
void
Java_net_dot_MonoRunner_setEnv (JNIEnv* env, jobject thiz, jstring j_key, jstring j_value);

void
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);

int
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);
Java_net_dot_MonoRunner_execEntryPoint (JNIEnv* env, jobject thiz, jstring j_entryPointLibName, jobjectArray j_args);

// called from C#
void
Expand Down Expand Up @@ -221,8 +224,8 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
free (user_data);
}

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

Expand Down Expand Up @@ -304,7 +307,11 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_NORMAL);
#endif // FULL_AOT
#endif // FORCE_INTERPRETER
}

static int
mono_droid_execute_assembly (const char *executable, int managed_argc, char* managed_argv[])
{
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

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

int
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)
void
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)
{
char file_dir[2048];
char cache_dir[2048];
char testresults_dir[2048];
char entryPointLibName[2048];
strncpy_str (env, file_dir, j_files_dir, sizeof(file_dir));
strncpy_str (env, cache_dir, j_cache_dir, sizeof(cache_dir));
strncpy_str (env, testresults_dir, j_testresults_dir, sizeof(testresults_dir));
strncpy_str (env, entryPointLibName, j_entryPointLibName, sizeof(entryPointLibName));

bundle_path = file_dir;
executable = entryPointLibName;

setenv ("HOME", bundle_path, true);
setenv ("TMPDIR", cache_dir, true);
setenv ("TEST_RESULTS_DIR", testresults_dir, true);

mono_droid_runtime_init (current_local_time);
}

int
Java_net_dot_MonoRunner_execEntryPoint (JNIEnv* env, jobject thiz, jstring j_entryPointLibName, jobjectArray j_args)
{
char entryPointLibName[2048];
strncpy_str (env, entryPointLibName, j_entryPointLibName, sizeof(entryPointLibName));

executable = entryPointLibName;
assert (executable);

int args_len = (*env)->GetArrayLength(env, j_args);
int managed_argc = args_len + 1;
char** managed_argv = (char**)malloc(managed_argc * sizeof(char*));

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

int res = mono_droid_runtime_init (executable, managed_argc, managed_argv, current_local_time);
int res = mono_droid_execute_assembly (executable, managed_argc, managed_argv);

for (int i = 0; i < args_len; ++i)
{
Expand Down
Loading