1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2012 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include <dlfcn.h> 9cb93a386Sopenharmony_ci#include <stdio.h> 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_civoid usage() { 12cb93a386Sopenharmony_ci printf("[USAGE] skia_launcher program_name [options]\n"); 13cb93a386Sopenharmony_ci printf(" program_name: the skia program you want to launch (e.g. tests, bench)\n"); 14cb93a386Sopenharmony_ci printf(" options: options specific to the program you are launching\n"); 15cb93a386Sopenharmony_ci} 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cibool file_exists(const char* fileName) { 18cb93a386Sopenharmony_ci FILE* file = fopen(fileName, "r"); 19cb93a386Sopenharmony_ci if (file) { 20cb93a386Sopenharmony_ci fclose(file); 21cb93a386Sopenharmony_ci return true; 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci return false; 24cb93a386Sopenharmony_ci} 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciint launch_app(int (*app_main)(int, const char**), int argc, 27cb93a386Sopenharmony_ci const char** argv) { 28cb93a386Sopenharmony_ci return (*app_main)(argc, argv); 29cb93a386Sopenharmony_ci} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_civoid* load_library(const char* appLocation, const char* libraryName) 32cb93a386Sopenharmony_ci{ 33cb93a386Sopenharmony_ci // attempt to lookup the location of the shared libraries 34cb93a386Sopenharmony_ci char libraryLocation[100]; 35cb93a386Sopenharmony_ci sprintf(libraryLocation, "%s/lib%s.so", appLocation, libraryName); 36cb93a386Sopenharmony_ci if (!file_exists(libraryLocation)) { 37cb93a386Sopenharmony_ci printf("ERROR: Unable to find the '%s' library in the Skia App.\n", libraryName); 38cb93a386Sopenharmony_ci printf("ERROR: Did you provide the correct program_name?\n"); 39cb93a386Sopenharmony_ci usage(); 40cb93a386Sopenharmony_ci return NULL; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci // load the appropriate library 44cb93a386Sopenharmony_ci void* appLibrary = dlopen(libraryLocation, RTLD_LOCAL | RTLD_LAZY); 45cb93a386Sopenharmony_ci if (!appLibrary) { 46cb93a386Sopenharmony_ci printf("ERROR: Unable to open the shared library.\n"); 47cb93a386Sopenharmony_ci printf("ERROR: %s", dlerror()); 48cb93a386Sopenharmony_ci return NULL; 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci return appLibrary; 52cb93a386Sopenharmony_ci} 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ciint main(int argc, const char** argv) { 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci // check that the program name was specified 57cb93a386Sopenharmony_ci if (argc < 2) { 58cb93a386Sopenharmony_ci printf("ERROR: No program_name was specified\n"); 59cb93a386Sopenharmony_ci usage(); 60cb93a386Sopenharmony_ci return -1; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci // attempt to lookup the location of the skia app 64cb93a386Sopenharmony_ci const char* appLocation = "/data/local/tmp"; 65cb93a386Sopenharmony_ci if (!file_exists(appLocation)) { 66cb93a386Sopenharmony_ci printf("ERROR: Unable to find /data/local/tmp on the device.\n"); 67cb93a386Sopenharmony_ci return -1; 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci#if defined(SKIA_DLL) 71cb93a386Sopenharmony_ci // load the local skia shared library 72cb93a386Sopenharmony_ci void* skiaLibrary = load_library(appLocation, "skia_android"); 73cb93a386Sopenharmony_ci if (NULL == skiaLibrary) 74cb93a386Sopenharmony_ci { 75cb93a386Sopenharmony_ci return -1; 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci#endif 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci // load the appropriate library 80cb93a386Sopenharmony_ci void* appLibrary = load_library(appLocation, argv[1]); 81cb93a386Sopenharmony_ci if (NULL == appLibrary) { 82cb93a386Sopenharmony_ci return -1; 83cb93a386Sopenharmony_ci } 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci // find the address of the main function 86cb93a386Sopenharmony_ci int (*app_main)(int, const char**); 87cb93a386Sopenharmony_ci *(void **) (&app_main) = dlsym(appLibrary, "main"); 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci if (!app_main) { 90cb93a386Sopenharmony_ci printf("ERROR: Unable to load the main function of the selected program.\n"); 91cb93a386Sopenharmony_ci printf("ERROR: %s\n", dlerror()); 92cb93a386Sopenharmony_ci return -1; 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci // pass all additional arguments to the main function 96cb93a386Sopenharmony_ci return launch_app(app_main, argc - 1, ++argv); 97cb93a386Sopenharmony_ci} 98