static void Sys_Android_Init( void ) { struct android_app *app = sys_android_app; JNIEnv *env; jobject activity = app->activity->clazz; // Set signal handlers. signal( SIGTERM, Sys_Android_SignalHandler ); signal( SIGINT, Sys_Android_SignalHandler ); // Set working directory to external data path. { char externalDataPath[PATH_MAX]; Q_snprintfz( externalDataPath, sizeof( externalDataPath ), "%s/%d.%d", app->activity->externalDataPath, APP_VERSION_MAJOR, APP_VERSION_MINOR ); FS_CreateAbsolutePath( externalDataPath ); Sys_FS_CreateDirectory( externalDataPath ); if( chdir( externalDataPath ) ) Sys_Error( "Failed to change working directory" ); } // Initialize JNI. if( pthread_key_create( &sys_android_jniEnvKey, Sys_Android_JNIEnvDestructor ) ) Sys_Error( "Failed to create JNIEnv destructor" ); env = Sys_Android_GetJNIEnv(); // Activity class shortcut. { jclass activityClass = (*env)->GetObjectClass( env, activity ); sys_android_activityClass = (*env)->NewGlobalRef( env, activityClass ); sys_android_getSystemService = (*env)->GetMethodID( env, activityClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;" ); (*env)->DeleteLocalRef( env, activityClass ); } // Get package name. { jmethodID getPackageName; jstring packageNameJS; const char *packageNameUTF; getPackageName = (*env)->GetMethodID( env, sys_android_activityClass, "getPackageName", "()Ljava/lang/String;" ); packageNameJS = (*env)->CallObjectMethod( env, activity, getPackageName ); packageNameUTF = (*env)->GetStringUTFChars( env, packageNameJS, NULL ); Q_strncpyz( sys_android_packageName, packageNameUTF, sizeof( sys_android_packageName ) ); (*env)->ReleaseStringUTFChars( env, packageNameJS, packageNameUTF ); (*env)->DeleteLocalRef( env, packageNameJS ); } // Initialize the wake lock. { jstring name; jobject power; jclass powerClass; jmethodID newWakeLock; jstring tag; jobject wl; name = (*env)->NewStringUTF( env, "power" ); power = (*env)->CallObjectMethod( env, activity, sys_android_getSystemService, name ); (*env)->DeleteLocalRef( env, name ); powerClass = (*env)->FindClass( env, "android/os/PowerManager" ); newWakeLock = (*env)->GetMethodID( env, powerClass, "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;" ); (*env)->DeleteLocalRef( env, powerClass ); tag = (*env)->NewStringUTF( env, "Qfusion" ); wl = (*env)->CallObjectMethod( env, power, newWakeLock, 1, tag ); (*env)->DeleteLocalRef( env, tag ); (*env)->DeleteLocalRef( env, power ); sys_android_wakeLock = (*env)->NewGlobalRef( env, wl ); (*env)->DeleteLocalRef( env, wl ); } // Set native app cmd handler to the actual one. app->onAppCmd = Sys_Android_OnAppCmd; // Check if browser links can be clicked. sys_android_browserAvailable = Sys_Android_CheckBrowserAvailability(); }
static void Sys_Android_Init( void ) { struct android_app *app = sys_android_app; JNIEnv *env; jobject activity = app->activity->clazz; // Resolve the app's internal storage root directory. { char relativePath[PATH_MAX]; Q_snprintfz( relativePath, sizeof( relativePath ), "%s/..", app->activity->internalDataPath ); realpath( relativePath, sys_android_internalDataPath ); } // Set working directory to external data path. { char externalDataPath[PATH_MAX]; Q_snprintfz( externalDataPath, sizeof( externalDataPath ), "%s/%d.%d/", // The trailing slash is here to make it a directory path, not a file path app->activity->externalDataPath, APP_VERSION_MAJOR, APP_VERSION_MINOR ); FS_CreateAbsolutePath( externalDataPath ); if( chdir( externalDataPath ) ) Sys_Error( "Failed to change working directory" ); } // Initialize JNI. if( pthread_key_create( &sys_android_jniEnvKey, Sys_Android_JNIEnvDestructor ) ) Sys_Error( "Failed to create JNIEnv destructor" ); env = Sys_Android_GetJNIEnv(); // Activity class shortcut. { jclass activityClass = (*env)->GetObjectClass( env, activity ); sys_android_activityClass = (*env)->NewGlobalRef( env, activityClass ); sys_android_getSystemService = (*env)->GetMethodID( env, activityClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;" ); (*env)->DeleteLocalRef( env, activityClass ); } // Get package name. { jmethodID getPackageName; jstring packageNameJS; const char *packageNameUTF; getPackageName = (*env)->GetMethodID( env, sys_android_activityClass, "getPackageName", "()Ljava/lang/String;" ); packageNameJS = (*env)->CallObjectMethod( env, activity, getPackageName ); packageNameUTF = (*env)->GetStringUTFChars( env, packageNameJS, NULL ); Q_strncpyz( sys_android_packageName, packageNameUTF, sizeof( sys_android_packageName ) ); (*env)->ReleaseStringUTFChars( env, packageNameJS, packageNameUTF ); (*env)->DeleteLocalRef( env, packageNameJS ); } // Initialize the wake lock. { jstring name; jobject power; jclass powerClass; jmethodID newWakeLock; jstring tag; jobject wakeLock; name = (*env)->NewStringUTF( env, "power" ); power = (*env)->CallObjectMethod( env, activity, sys_android_getSystemService, name ); (*env)->DeleteLocalRef( env, name ); powerClass = (*env)->FindClass( env, "android/os/PowerManager" ); newWakeLock = (*env)->GetMethodID( env, powerClass, "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;" ); (*env)->DeleteLocalRef( env, powerClass ); tag = (*env)->NewStringUTF( env, "Qfusion" ); wakeLock = (*env)->CallObjectMethod( env, power, newWakeLock, 1 /* PARTIAL_WAKE_LOCK */, tag ); (*env)->DeleteLocalRef( env, tag ); (*env)->DeleteLocalRef( env, power ); sys_android_wakeLock = (*env)->NewGlobalRef( env, wakeLock ); (*env)->DeleteLocalRef( env, wakeLock ); } // Initialize the high-performance Wi-Fi lock. { jstring name; jobject wifi; jclass wifiClass; jmethodID createWifiLock; jstring tag; jobject wifiLock; name = (*env)->NewStringUTF( env, "wifi" ); wifi = (*env)->CallObjectMethod( env, activity, sys_android_getSystemService, name ); (*env)->DeleteLocalRef( env, name ); wifiClass = (*env)->FindClass( env, "android/net/wifi/WifiManager" ); createWifiLock = (*env)->GetMethodID( env, wifiClass, "createWifiLock", "(ILjava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;" ); (*env)->DeleteLocalRef( env, wifiClass ); tag = (*env)->NewStringUTF( env, "Qfusion" ); wifiLock = (*env)->CallObjectMethod( env, wifi, createWifiLock, 3 /* WIFI_MODE_FULL_HIGH_PERF */, tag ); (*env)->DeleteLocalRef( env, tag ); (*env)->DeleteLocalRef( env, wifi ); sys_android_wifiLock = (*env)->NewGlobalRef( env, wifiLock ); (*env)->DeleteLocalRef( env, wifiLock ); } // Set native app cmd handler to the actual one. app->onAppCmd = Sys_Android_OnAppCmd; // Check if browser links can be clicked. sys_android_browserAvailable = Sys_Android_CheckBrowserAvailability(); }