@@ -846,41 +846,48 @@ JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(JNIEnv *env, jclass cls,
846846 char * * argv ;
847847 bool isstack ;
848848
849- // Prepare the arguments.
849+ // Always use the name "app_process" for argv[0] so PHYSFS_platformCalcBaseDir() works.
850+ // https://github.com/love2d/love-android/issues/24
851+
850852 len = (* env )-> GetArrayLength (env , array );
851- argv = SDL_small_alloc (char * , 1 + len + 1 , & isstack ); // !!! FIXME: check for NULL
852- argc = 0 ;
853- /* Use the name "app_process" so PHYSFS_platformCalcBaseDir() works.
854- https://github.com/love2d/love-android/issues/24
855- */
856- argv [argc ++ ] = SDL_strdup ("app_process" );
857- for (i = 0 ; i < len ; ++ i ) {
858- char * arg = NULL ;
859- jstring string = (* env )-> GetObjectArrayElement (env , array , i );
860- if (string ) {
861- const char * utf = (* env )-> GetStringUTFChars (env , string , 0 );
862- if (utf ) {
863- arg = SDL_strdup (utf );
864- (* env )-> ReleaseStringUTFChars (env , string , utf );
853+ argv = SDL_small_alloc (char * , 1 + len + 1 , & isstack );
854+ if (!argv ) {
855+ // Failed to allocate the argv (out of memory). Use a dummy argv instead.
856+ char fallbackargv0 [] = { 'a' , 'p' , 'p' , '_' , 'p' , 'r' , 'o' , 'c' , 'e' , 's' , 's' , '\0' };
857+ char * fallbackargv [2 ] = { fallbackargv0 , NULL };
858+
859+ // Run the application (without arguments).
860+ status = SDL_main (1 , fallbackargv );
861+ } else {
862+ argc = 0 ;
863+ argv [argc ++ ] = SDL_strdup ("app_process" );
864+ for (i = 0 ; i < len ; ++ i ) {
865+ char * arg = NULL ;
866+ jstring string = (* env )-> GetObjectArrayElement (env , array , i );
867+ if (string ) {
868+ const char * utf = (* env )-> GetStringUTFChars (env , string , 0 );
869+ if (utf ) {
870+ arg = SDL_strdup (utf );
871+ (* env )-> ReleaseStringUTFChars (env , string , utf );
872+ }
873+ (* env )-> DeleteLocalRef (env , string );
865874 }
866- ( * env ) -> DeleteLocalRef ( env , string );
867- }
868- if ( arg == NULL ) {
869- arg = SDL_strdup ( "" ) ;
875+ if ( arg == NULL ) {
876+ arg = SDL_strdup ( "" );
877+ }
878+ argv [ argc ++ ] = arg ;
870879 }
871- argv [argc ++ ] = arg ;
872- }
873- argv [argc ] = NULL ;
880+ argv [argc ] = NULL ;
874881
875- // Run the application.
876- status = SDL_main (argc , argv );
882+ // Run the application.
883+ status = SDL_main (argc , argv );
877884
878- // Release the arguments.
879- for (i = 0 ; i < argc ; ++ i ) {
880- SDL_free (argv [i ]);
885+ // Release the arguments.
886+ for (i = 0 ; i < argc ; ++ i ) {
887+ SDL_free (argv [i ]);
888+ }
889+ SDL_small_free (argv , isstack );
881890 }
882- SDL_small_free (argv , isstack );
883-
884891 } else {
885892 __android_log_print (ANDROID_LOG_ERROR , "SDL" , "nativeRunMain(): Couldn't find function %s in library %s" , function_name , library_file );
886893 }
0 commit comments