コード例 #1
0
ファイル: android_sys.c プロジェクト: MGXRace/racesow
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();
}
コード例 #2
0
ファイル: android_sys.c プロジェクト: DenMSC/qfusion
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();
}