@@ -62,6 +62,9 @@ typedef struct MonoImage_ MonoImage;
62
62
typedef struct MonoObject_ MonoObject ;
63
63
typedef struct MonoThread_ MonoThread ;
64
64
65
+ /* Imported from `mono-logger.h` */
66
+ typedef void (* MonoLogCallback ) (const char * log_domain , const char * log_level , const char * message , int32_t fatal , void * user_data );
67
+
65
68
/*
66
69
* The "err" variable contents must be allocated using g_malloc or g_strdup
67
70
*/
@@ -93,6 +96,8 @@ typedef void (*mono_domain_set_config_fn) (MonoDomain *, const char *, const cha
93
96
typedef int (* mono_runtime_set_main_args_fn ) (int argc , char * argv []);
94
97
typedef MonoMethod * (* mono_class_get_methods_fn ) (MonoClass * klass , void * * iter );
95
98
typedef const char * (* mono_method_get_name_fn ) (MonoMethod * method );
99
+ typedef void (* mono_trace_init_fn ) (void );
100
+ typedef void (* mono_trace_set_log_handler_fn ) (MonoLogCallback callback , void * user_data );
96
101
97
102
static JavaVM * jvm ;
98
103
@@ -119,6 +124,8 @@ static mono_domain_set_config_fn mono_domain_set_config;
119
124
static mono_runtime_set_main_args_fn mono_runtime_set_main_args ;
120
125
static mono_class_get_methods_fn mono_class_get_methods ;
121
126
static mono_method_get_name_fn mono_method_get_name ;
127
+ static mono_trace_init_fn mono_trace_init ;
128
+ static mono_trace_set_log_handler_fn mono_trace_set_log_handler ;
122
129
123
130
static MonoAssembly * main_assembly ;
124
131
static void * runtime_bootstrap_dso ;
@@ -131,13 +138,82 @@ static void* my_dlopen (const char *name, int flags, char **err, void *user_data
131
138
132
139
133
140
//stuff
141
+
142
+ static void
143
+ _runtime_log (const char * log_domain , const char * log_level , const char * message , int32_t fatal , void * user_data )
144
+ {
145
+ static jclass AndroidRunner_klass = NULL ;
146
+ static jmethodID AndroidRunner_WriteLineToInstrumentation_method = NULL ;
147
+ JNIEnv * env ;
148
+ jstring j_message ;
149
+
150
+ if (jvm == NULL )
151
+ __android_log_assert ("" , "mono-sdks" , "%s: jvm is NULL" , __func__ );
152
+
153
+ (* jvm )-> GetEnv (jvm , (void * * )& env , JNI_VERSION_1_6 );
154
+
155
+ if (AndroidRunner_klass == NULL || AndroidRunner_WriteLineToInstrumentation_method == NULL ) {
156
+ AndroidRunner_klass = (* env )-> FindClass (env , "org/mono/android/AndroidRunner" );
157
+ AndroidRunner_WriteLineToInstrumentation_method = (* env )-> GetStaticMethodID (env , AndroidRunner_klass , "WriteLineToInstrumentation" , "(Ljava/lang/String;)V" );
158
+ }
159
+
160
+ j_message = (* env )-> NewStringUTF (env , message );
161
+
162
+ (* env )-> CallStaticVoidMethod (env , AndroidRunner_klass , AndroidRunner_WriteLineToInstrumentation_method , j_message );
163
+
164
+ (* env )-> DeleteLocalRef (env , j_message );
165
+
166
+ /* Still print it on the logcat */
167
+
168
+ android_LogPriority android_log_level ;
169
+ switch (* log_level ) {
170
+ case 'e' : /* error */
171
+ android_log_level = ANDROID_LOG_FATAL ;
172
+ break ;
173
+ case 'c' : /* critical */
174
+ android_log_level = ANDROID_LOG_ERROR ;
175
+ break ;
176
+ case 'w' : /* warning */
177
+ android_log_level = ANDROID_LOG_WARN ;
178
+ break ;
179
+ case 'm' : /* message */
180
+ android_log_level = ANDROID_LOG_INFO ;
181
+ break ;
182
+ case 'i' : /* info */
183
+ android_log_level = ANDROID_LOG_DEBUG ;
184
+ break ;
185
+ case 'd' : /* debug */
186
+ android_log_level = ANDROID_LOG_VERBOSE ;
187
+ break ;
188
+ default :
189
+ android_log_level = ANDROID_LOG_UNKNOWN ;
190
+ break ;
191
+ }
192
+
193
+ __android_log_write (android_log_level , log_domain , message );
194
+ if (android_log_level == ANDROID_LOG_FATAL )
195
+ abort ();
196
+ }
197
+
134
198
static void
135
199
_log (const char * format , ...)
136
200
{
137
201
va_list args ;
202
+ char * buf ;
203
+ int nbuf ;
204
+
205
+ errno = 0 ;
206
+
138
207
va_start (args , format );
139
- __android_log_vprint ( ANDROID_LOG_INFO , "MONO" , format , args );
208
+ nbuf = vasprintf ( & buf , format , args );
140
209
va_end (args );
210
+
211
+ if (buf == NULL || nbuf == -1 )
212
+ __android_log_assert ("" , "mono-sdks" , "%s: vasprintf failed, error: \"%s\" (%d), nbuf = %d, buf = \"%s\"" , __func__ , strerror (errno ), errno , nbuf , buf ? buf : "(null)" );
213
+
214
+ _runtime_log ("mono-sdks" , "debug" , buf , 0 , NULL );
215
+
216
+ free (buf );
141
217
}
142
218
143
219
static void
@@ -243,10 +319,10 @@ Java_org_mono_android_AndroidRunner_runTests (JNIEnv* env, jobject thiz, jstring
243
319
strncpy_str (env , data_dir , j_data_dir , sizeof (data_dir ));
244
320
strncpy_str (env , assemblies_dir , j_assembly_dir , sizeof (assemblies_dir ));
245
321
246
- _log ("-- file dir %s\n " , file_dir );
247
- _log ("-- cache dir %s\n " , cache_dir );
248
- _log ("-- data dir %s\n " , data_dir );
249
- _log ("-- assembly dir %s\n " , assemblies_dir );
322
+ _log ("-- file dir %s" , file_dir );
323
+ _log ("-- cache dir %s" , cache_dir );
324
+ _log ("-- data dir %s" , data_dir );
325
+ _log ("-- assembly dir %s" , assemblies_dir );
250
326
prctl (PR_SET_DUMPABLE , 1 );
251
327
252
328
snprintf (buff , sizeof (buff ), "%s/libmonosgen-2.0.so" , data_dir );
@@ -279,6 +355,8 @@ Java_org_mono_android_AndroidRunner_runTests (JNIEnv* env, jobject thiz, jstring
279
355
mono_runtime_set_main_args = dlsym (libmono , "mono_runtime_set_main_args" );
280
356
mono_class_get_methods = dlsym (libmono , "mono_class_get_methods" );
281
357
mono_method_get_name = dlsym (libmono , "mono_method_get_name" );
358
+ mono_trace_init = dlsym (libmono , "mono_trace_init" );
359
+ mono_trace_set_log_handler = dlsym (libmono , "mono_trace_set_log_handler" );
282
360
283
361
//MUST HAVE envs
284
362
setenv ("TMPDIR" , cache_dir , 1 );
@@ -290,9 +368,13 @@ Java_org_mono_android_AndroidRunner_runTests (JNIEnv* env, jobject thiz, jstring
290
368
create_and_set (file_dir , "home/.config" , "XDG_CONFIG_HOME" );
291
369
292
370
//Debug flags
293
- // setenv ("MONO_LOG_LEVEL", "debug", 1);
371
+ setenv ("MONO_LOG_LEVEL" , "info" , 1 );
372
+ setenv ("MONO_LOG_MASK" , "all" , 1 );
294
373
// setenv ("MONO_VERBOSE_METHOD", "GetCallingAssembly", 1);
295
374
375
+ mono_trace_init ();
376
+ mono_trace_set_log_handler (_runtime_log , NULL );
377
+
296
378
mono_set_assemblies_path (assemblies_dir );
297
379
mono_set_crash_chaining (1 );
298
380
mono_set_signal_chaining (1 );
@@ -558,24 +640,6 @@ _monodroid_get_dns_servers (void **dns_servers_array)
558
640
return count ;
559
641
}
560
642
561
- MONO_API void
562
- AndroidIntrumentationWriter_WriteLineToInstrumentation (char * chars )
563
- {
564
- JNIEnv * env ;
565
- jclass AndroidRunner_klass ;
566
- jmethodID AndroidRunner_WriteLineToInstrumentation_method ;
567
- jstring j_chars ;
568
-
569
- (* jvm )-> GetEnv (jvm , (void * * )& env , JNI_VERSION_1_6 );
570
-
571
- AndroidRunner_klass = (* env )-> FindClass (env , "org/mono/android/AndroidRunner" );
572
- AndroidRunner_WriteLineToInstrumentation_method = (* env )-> GetStaticMethodID (env , AndroidRunner_klass , "WriteLineToInstrumentation" , "(Ljava/lang/String;)V" );
573
-
574
- j_chars = (* env )-> NewStringUTF (env , chars );
575
-
576
- (* env )-> CallStaticVoidMethod (env , AndroidRunner_klass , AndroidRunner_WriteLineToInstrumentation_method , j_chars );
577
- }
578
-
579
643
JNIEXPORT jint JNICALL
580
644
JNI_OnLoad (JavaVM * vm , void * reserved )
581
645
{
0 commit comments