Xash3D FWGS engine.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
3.9 KiB

/*
android_nosdl.c - android backend
Copyright (C) 2016-2019 mittorn
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "platform/platform.h"
#if !defined(XASH_DEDICATED)
#include "input.h"
#include "client.h"
#include "sound.h"
#include "errno.h"
#include <pthread.h>
#include <sys/prctl.h>
#include <android/log.h>
#include <jni.h>
#include <SDL.h>
struct jnimethods_s
{
JNIEnv *env;
jobject activity;
jclass actcls;
jmethodID getID;
jmethodID saveID;
jmethodID loadID;
jmethodID getKeyboardHeight;
} jni;
void Android_Init( void )
{
jni.env = (JNIEnv *)SDL_AndroidGetJNIEnv();
jni.activity = (jobject)SDL_AndroidGetActivity();
jni.actcls = (*jni.env)->GetObjectClass( jni.env, jni.activity );
jni.loadID = (*jni.env)->GetMethodID( jni.env, jni.actcls, "loadAndroidID", "()Ljava/lang/String;" );
jni.getID = (*jni.env)->GetMethodID( jni.env, jni.actcls, "getAndroidID", "()Ljava/lang/String;" );
jni.saveID = (*jni.env)->GetMethodID( jni.env, jni.actcls, "saveAndroidID", "(Ljava/lang/String;)V" );
jni.getKeyboardHeight = (*jni.env)->GetMethodID( jni.env, jni.actcls, "getKeyboardHeight", "()I" );
SDL_SetHint( SDL_HINT_ORIENTATIONS, "LandscapeLeft LandscapeRight" );
SDL_SetHint( SDL_HINT_JOYSTICK_HIDAPI_STEAM, "1" );
SDL_SetHint( SDL_HINT_ANDROID_BLOCK_ON_PAUSE, "0" );
SDL_SetHint( SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO, "0" );
SDL_SetHint( SDL_HINT_ANDROID_TRAP_BACK_BUTTON, "1" );
}
/*
========================
Android_GetNativeObject
========================
*/
void *Android_GetNativeObject( const char *name )
{
static const char *availObjects[] = { "JNIEnv", "ActivityClass", NULL };
void *object = NULL;
if( !name )
{
object = (void *)availObjects;
}
else if( !strcasecmp( name, "JNIEnv" ) )
{
object = (void *)jni.env;
}
else if( !strcasecmp( name, "ActivityClass" ) )
{
object = (void *)jni.actcls;
}
return object;
}
/*
========================
Android_GetAndroidID
========================
*/
const char *Android_GetAndroidID( void )
{
static char id[32];
jstring resultJNIStr;
const char *resultCStr;
if( COM_CheckString( id ) ) return id;
resultJNIStr = (*jni.env)->CallObjectMethod( jni.env, jni.activity, jni.getID );
resultCStr = (*jni.env)->GetStringUTFChars( jni.env, resultJNIStr, NULL );
Q_strncpy( id, resultCStr, sizeof( id ) );
(*jni.env)->ReleaseStringUTFChars( jni.env, resultJNIStr, resultCStr );
return id;
}
/*
========================
Android_LoadID
========================
*/
const char *Android_LoadID( void )
{
static char id[32];
jstring resultJNIStr;
const char *resultCStr;
resultJNIStr = (*jni.env)->CallObjectMethod( jni.env, jni.activity, jni.loadID );
resultCStr = (*jni.env)->GetStringUTFChars( jni.env, resultJNIStr, NULL );
Q_strncpy( id, resultCStr, sizeof( id ) );
(*jni.env)->ReleaseStringUTFChars( jni.env, resultJNIStr, resultCStr );
return id;
}
/*
========================
Android_SaveID
========================
*/
void Android_SaveID( const char *id )
{
(*jni.env)->CallVoidMethod( jni.env, jni.activity, jni.saveID, (*jni.env)->NewStringUTF( jni.env, id ) );
}
/*
========================
Android_ShellExecute
========================
*/
void Platform_ShellExecute( const char *path, const char *parms )
{
#if SDL_VERSION_ATLEAST( 2, 0, 14 )
SDL_OpenURL( path );
#endif
}
/*
========================
Android_GetKeyboardHeight
========================
*/
int Android_GetKeyboardHeight( void )
{
return (*jni.env)->CallIntMethod( jni.env, jni.activity, jni.getKeyboardHeight );
}
#endif // XASH_DEDICATED