mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-09 10:19:38 +00:00
Initial android support
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
#ifdef ANDROID
|
||||
|
||||
#include <android/log.h>
|
||||
#include <jni.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include "tier0/threadtools.h"
|
||||
|
||||
char *LauncherArgv[512];
|
||||
char java_args[4096];
|
||||
int iLastArgs = 0;
|
||||
|
||||
#define MAX_PATH 2048
|
||||
|
||||
#define TAG "SRCENG"
|
||||
#define PRIO ANDROID_LOG_DEBUG
|
||||
#define LogPrintf(...) do { __android_log_print(PRIO, TAG, __VA_ARGS__); printf( __VA_ARGS__); } while( 0 );
|
||||
#define DLLEXPORT extern "C" __attribute__((visibility("default")))
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_setDataDirectoryPath(JNIEnv *env, jclass *clazz, jstring path)
|
||||
{
|
||||
setenv( "APP_DATA_PATH", env->GetStringUTFChars(path, NULL), 1);
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity2_setDataDirectoryPath: %s", getenv("APP_DATA_PATH") );
|
||||
}
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_setGameDirectoryPath(JNIEnv *env, jclass *clazz, jstring path)
|
||||
{
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity2_setGameDirectoryPath" );
|
||||
setenv( "VALVE_GAME_PATH", env->GetStringUTFChars(path, NULL), 1 );
|
||||
}
|
||||
|
||||
DLLEXPORT int Java_com_valvesoftware_ValveActivity2_setenv(JNIEnv *jenv, jclass *jclass, jstring env, jstring value, jint over)
|
||||
{
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity2_setenv %s=%s", jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL) );
|
||||
return setenv( jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL), over );
|
||||
}
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_nativeOnActivityResult()
|
||||
{
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity_nativeOnActivityResult" );
|
||||
}
|
||||
|
||||
typedef void (*t_egl_init)();
|
||||
t_egl_init egl_init;
|
||||
|
||||
void parseArgs( char *args )
|
||||
{
|
||||
char *pch;
|
||||
pch = strtok (args," ");
|
||||
while (pch != NULL)
|
||||
{
|
||||
LauncherArgv[iLastArgs++] = pch;
|
||||
pch = strtok (NULL, " ");
|
||||
}
|
||||
}
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_setArgs(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
strncpy( java_args, env->GetStringUTFChars(str, NULL), sizeof java_args );
|
||||
}
|
||||
|
||||
DLLEXPORT int LauncherMain( int argc, char **argv );
|
||||
|
||||
#define A(a,b) LauncherArgv[iLastArgs++] = (char*)a; \
|
||||
LauncherArgv[iLastArgs++] = (char*)b
|
||||
|
||||
#define D(a) LauncherArgv[iLastArgs++] = (char*)a
|
||||
|
||||
void SetLauncherArgs()
|
||||
{
|
||||
static char binPath[MAX_PATH];
|
||||
snprintf(binPath, MAX_PATH, "%s/hl2_linux", getenv("APP_DATA_PATH") );
|
||||
LogPrintf(binPath);
|
||||
D(binPath);
|
||||
|
||||
parseArgs(java_args);
|
||||
|
||||
A("-game", "hl2");
|
||||
D("-window");
|
||||
D("-nosteam");
|
||||
D("-insecure");
|
||||
}
|
||||
|
||||
DLLEXPORT int LauncherMainAndroid( int argc, char **argv )
|
||||
{
|
||||
|
||||
SetLauncherArgs();
|
||||
|
||||
void *glHandle = dlopen("libgl4es.so", 0);
|
||||
egl_init = (t_egl_init)dlsym(glHandle, "egl_init");
|
||||
if( egl_init )
|
||||
egl_init();
|
||||
|
||||
DeclareCurrentThreadIsMainThread(); // Init thread propertly on Android
|
||||
|
||||
return LauncherMain(iLastArgs, LauncherArgv);
|
||||
}
|
||||
|
||||
#endif
|
||||
+5
-288
@@ -253,7 +253,11 @@ bool GetExecutableName( char *out, int outSize )
|
||||
//-----------------------------------------------------------------------------
|
||||
char *GetBaseDirectory( void )
|
||||
{
|
||||
#ifdef ANDROID
|
||||
return getenv("VALVE_GAME_PATH");
|
||||
#else
|
||||
return g_szBasedir;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -1172,294 +1176,6 @@ static const char *BuildCommand()
|
||||
return (const char *)build.Base();
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
char dataDir[512];
|
||||
|
||||
const char *LauncherArgv[512];
|
||||
char javaArgv[2048];
|
||||
char gameName[512];
|
||||
char startArgs[256][128];
|
||||
char language[1024] = "english";
|
||||
int iLastArgs = 0;
|
||||
static int scr_width,scr_height;
|
||||
|
||||
bool bClient_loaded = false;
|
||||
bool bShowTouch = true;
|
||||
void *libclient;
|
||||
|
||||
static struct jnimethods_s
|
||||
{
|
||||
jclass actcls;
|
||||
JavaVM *vm;
|
||||
JNIEnv *env;
|
||||
jmethodID enableTextInput;
|
||||
} jni;
|
||||
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setMainPackFilePath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setMainPackFilePath" );
|
||||
return setenv( "VALVE_PAK0_PATH", env->GetStringUTFChars(str, NULL), 1 );
|
||||
}
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setPatchPackFilePath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setPatchPackFilePath" );
|
||||
return setenv( "VALVE_PAK1_PATH", env->GetStringUTFChars(str, NULL), 1 );
|
||||
}
|
||||
DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_setCacheDirectoryPath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setCacheDirectoryPath" );
|
||||
//return setenv( "VALVE_CACHE_PATH", env->GetStringUTFChars(str, NULL), 1 );
|
||||
}
|
||||
DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_gpgsStart()
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_gpgsStart" );
|
||||
}
|
||||
DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_nativeOnActivityResult()
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_nativeOnActivityResult" );
|
||||
}
|
||||
|
||||
DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_setNativeLibPath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setNativeLibPath" );
|
||||
// snprintf(dataDir, sizeof dataDir, env->GetStringUTFChars(str, NULL));
|
||||
}
|
||||
DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_setLanguage(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
snprintf(language, sizeof language, "%s", env->GetStringUTFChars(str, NULL));
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setLanguage" );
|
||||
}
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setDocumentDirectoryPath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setDocumentDirectoryPath" );
|
||||
setenv( "HOME", env->GetStringUTFChars(str, NULL), 1);
|
||||
return setenv( "VALVE_CACHE_PATH", env->GetStringUTFChars(str, NULL), 1 );
|
||||
}
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setDropMip(int a1, int a2, signed int a3)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setDropMip" );
|
||||
}
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_saveGame()
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_saveGame" );
|
||||
}
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setDataDirectoryPath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity_setDataDirectoryPath" );
|
||||
snprintf(dataDir, sizeof dataDir, env->GetStringUTFChars(str, NULL));
|
||||
}
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setExtrasPackFilePath(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity2_setExtrasPackFilePath" );
|
||||
return setenv( "VALVE_PAK2_PATH", env->GetStringUTFChars(str, NULL), 1 );
|
||||
}
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setenv(JNIEnv *jenv, jclass *jclass, jstring env, jstring value, jint over)
|
||||
{
|
||||
__android_log_print( ANDROID_LOG_DEBUG, "SourceSDK2013", "Java_com_valvesoftware_ValveActivity2_setenv %s=%s", jenv->GetStringUTFChars(env, NULL),jenv->GetStringUTFChars(value, NULL) );
|
||||
return setenv( jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL), over );
|
||||
}
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setGame(JNIEnv *jenv, jclass *jclass, jstring game)
|
||||
{
|
||||
snprintf(gameName, sizeof dataDir, "-game %s", jenv->GetStringUTFChars(game, NULL));
|
||||
return setenv( "VALVE_MOD", jenv->GetStringUTFChars(game, NULL), 1);
|
||||
}
|
||||
|
||||
typedef void (*t_TouchEvent)(int finger, int x, int y, int act);
|
||||
t_TouchEvent TouchEvent;
|
||||
|
||||
DLL_EXPORT void clientLoaded( void )
|
||||
{
|
||||
bClient_loaded = true;
|
||||
libclient = dlopen("libclient.so",0);
|
||||
TouchEvent = (t_TouchEvent)dlsym(libclient, "TouchEvent");
|
||||
((void (*)(bool, int, int))dlsym(libclient, "showTouch"))(bShowTouch, scr_width, scr_height);
|
||||
}
|
||||
|
||||
DLL_EXPORT void showKeyboard( int show )
|
||||
{
|
||||
jni.env->CallStaticVoidMethod( jni.actcls, jni.enableTextInput, show );
|
||||
}
|
||||
|
||||
DLL_EXPORT void JNICALL Java_com_valvesoftware_ValveActivity2_showTouch(JNIEnv *env, jobject obj, jboolean show_touch, jint width, jint height)
|
||||
{
|
||||
scr_width = width;
|
||||
scr_height = height;
|
||||
bShowTouch = show_touch;
|
||||
}
|
||||
|
||||
DLL_EXPORT void JNICALL Java_com_valvesoftware_ValveActivity2_TouchEvent(JNIEnv *env, jobject obj, jint fingerid, jint x, jint y, jint action)
|
||||
{
|
||||
if( !bClient_loaded )
|
||||
return;
|
||||
|
||||
TouchEvent( fingerid, x, y, action );
|
||||
}
|
||||
|
||||
DLL_EXPORT const char* getSystemLanguage()
|
||||
{
|
||||
return language;
|
||||
}
|
||||
|
||||
typedef void (*t_SDL_Android_Init)(JNIEnv* env, jclass cls);
|
||||
t_SDL_Android_Init SDL_Android_Init;
|
||||
|
||||
//typedef void *(*t_SDL_StartTextInput)();
|
||||
//t_SDL_StartTextInput SDL_StartTextInput;
|
||||
|
||||
typedef void (*t_egl_init)();
|
||||
t_egl_init egl_init;
|
||||
|
||||
bool bUseGL;
|
||||
|
||||
void SetRenderer()
|
||||
{
|
||||
if ( bUseGL )
|
||||
{
|
||||
//setenv("USE_BIG_GL", "1", 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
setenv("REGAL_LOG", "0", 1);
|
||||
setenv("REGAL_LOG_ERROR", "0", 1);
|
||||
setenv("REGAL_LOG_WARNING", "0", 1);
|
||||
setenv("REGAL_LOG_INFO", "0", 1);
|
||||
setenv("REGAL_LOG_HTTP", "0", 1);
|
||||
setenv("REGAL_LOG_JSON", "0", 1);
|
||||
setenv("REGAL_LOG_CALLBACK", "0", 1);
|
||||
setenv("REGAL_LOG_ONCE", "0", 1);
|
||||
setenv("REGAL_LOG_POINTERS", "0", 1);
|
||||
setenv("REGAL_LOG_THREAD", "0", 1);
|
||||
setenv("REGAL_LOG_PROCESS", "0", 1);
|
||||
setenv("REGAL_LOG_ALL", "0", 1);
|
||||
setenv("REGAL_DEBUG", "0", 1);
|
||||
setenv("REGAL_ERROR", "0", 1);
|
||||
setenv("REGAL_LOG_FILE", "/dev/null", 1);
|
||||
setenv("REGAL_EMU_SO", "0", 1);
|
||||
setenv("REGAL_THREAD_LOCKING", "0", 1);
|
||||
setenv("REGAL_FORCE_ES2_PROFILE", "1", 1);
|
||||
setenv("REGAL_SYS_GLX", "0", 1);
|
||||
setenv("REGAL_SYS_ES2", "1", 1);
|
||||
setenv("REGAL_SYS_EGL", "1", 1);
|
||||
setenv("REGAL_SYS_GL", "0", 1);
|
||||
setenv("REGAL_GL_VERSION", "2.1", 1);
|
||||
setenv("REGAL_GL_EXTENSIONS", "GL_EXT_framebuffer_object GL_EXT_framebuffer_blit GL_OES_mapbuffer GL_EXT_texture_sRGB_decode GL_EXT_texture_compression_s3tc GL_EXT_texture_compression_dxt1", 1);
|
||||
}
|
||||
}
|
||||
|
||||
void SetArg( const char *arg )
|
||||
{
|
||||
char *pch;
|
||||
char str[1024];
|
||||
strncpy( str, arg, sizeof str );
|
||||
pch = strtok (str," ");
|
||||
while (pch != NULL)
|
||||
{
|
||||
strncpy( startArgs[iLastArgs], pch, sizeof startArgs[0] );
|
||||
LauncherArgv[iLastArgs] = startArgs[iLastArgs];
|
||||
iLastArgs++;
|
||||
pch = strtok (NULL, " ");
|
||||
}
|
||||
}
|
||||
|
||||
DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setArgs(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
snprintf( javaArgv, sizeof javaArgv, env->GetStringUTFChars(str, NULL) );
|
||||
}
|
||||
|
||||
void SetStartArgs()
|
||||
{
|
||||
char lang[2048];
|
||||
snprintf(lang, sizeof lang, "-language %s +cc_lang %s", language, language);
|
||||
|
||||
SetArg(dataDir);
|
||||
SetArg(lang);
|
||||
SetArg(gameName);
|
||||
SetArg(javaArgv);
|
||||
SetArg("-window "
|
||||
"-nosteam "
|
||||
"-nouserclip "
|
||||
"+sv_unlockedchapters 99 "
|
||||
"+mat_queue_mode 2 "
|
||||
"-ignoredxsupportcfg "
|
||||
"-regal "
|
||||
"+gl_rt_forcergba 1 "
|
||||
"+mat_antialias 1 "
|
||||
"-mat_antialias 1 "
|
||||
"+r_flashlightdepthtexture 1 "
|
||||
"+gl_dropmips 1 "
|
||||
"-insecure");
|
||||
|
||||
if( bUseGL )
|
||||
SetArg("-userclip "
|
||||
"-gl_disablesamplerobjects "
|
||||
// "-egl "
|
||||
"+gl_enabletexsubimage 1 "
|
||||
"+gl_blitmode 1 "
|
||||
"+gl_supportMapBuffer 0 "
|
||||
"-gl_separatedepthstencil 0 "
|
||||
"-gl_nodepthtexture 0 "
|
||||
"+r_flashlight_version2 0 "
|
||||
"+gl_emurgba16 0 "
|
||||
"+gl_emunooverwrite 0");
|
||||
else
|
||||
SetArg("-nouserclip "
|
||||
"-gl_disablesamplerobjects "
|
||||
"+gl_enabletexsubimage 0 "
|
||||
"+mat_reducefillrate 1 "
|
||||
"+gl_blitmode 1 "
|
||||
"+gl_supportMapBuffer 1 "
|
||||
"-gl_separatedepthstencil 0 "// default is 1
|
||||
"-gl_nodepthtexture 1 "
|
||||
"+r_flashlight_version2 1 "
|
||||
"+gl_emurgba16 1 "
|
||||
"+gl_emunooverwrite 1");
|
||||
}
|
||||
|
||||
DLL_EXPORT int LauncherMain( int argc, char **argv );
|
||||
|
||||
DLL_EXPORT int LauncherMainAndroid( int argc, char **argv )
|
||||
{
|
||||
//void *sdlHandle = dlopen("libSDL2.so", 0);
|
||||
|
||||
//SDL_Android_Init = (t_SDL_Android_Init)dlsym(sdlHandle, "SDL_Android_Init");
|
||||
//SDL_Android_Init(env, cls);
|
||||
|
||||
//SDL_StartTextInput = (t_SDL_StartTextInput)dlsym(sdlHandle, "SDL_StartTextInput");
|
||||
//SDL_StartTextInput();
|
||||
|
||||
// unused?
|
||||
chdir(dataDir);
|
||||
getcwd(dataDir, sizeof dataDir);
|
||||
setenv( "VALVE_GAME_PATH", dataDir, 1 );
|
||||
snprintf(dataDir, sizeof dataDir, "%s/hl2_linux", dataDir);
|
||||
|
||||
bUseGL = false;
|
||||
|
||||
SetRenderer();
|
||||
SetStartArgs();
|
||||
|
||||
//#ifdef GL4ES
|
||||
void *glHandle = dlopen("libGL4ES.so", 0);
|
||||
egl_init = (t_egl_init)dlsym(glHandle, "egl_init");
|
||||
if( egl_init )
|
||||
egl_init();
|
||||
//#endif
|
||||
|
||||
//jni.env = env;
|
||||
//jni.actcls = env->FindClass("org/libsdl/app/SDLActivity");
|
||||
//jni.enableTextInput = env->GetStaticMethodID(jni.actcls, "showKeyboard", "(I)V");
|
||||
|
||||
return LauncherMain(iLastArgs, LauncherArgv);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: The real entry point for the application
|
||||
// Input : hInstance -
|
||||
@@ -1742,6 +1458,7 @@ DLL_EXPORT int LauncherMain( int argc, char **argv )
|
||||
|
||||
// Figure out the directory the executable is running from
|
||||
// and make that be the current working directory
|
||||
|
||||
_chdir( GetBaseDirectory() );
|
||||
|
||||
g_LeakDump.m_bCheckLeaks = CommandLine()->CheckParm( "-leakcheck" ) ? true : false;
|
||||
|
||||
+2
-1
@@ -19,6 +19,7 @@ def build(bld):
|
||||
'../public/filesystem_init.cpp',
|
||||
'launcher.cpp',
|
||||
'reslistgenerator.cpp',
|
||||
'android.cpp'
|
||||
]
|
||||
|
||||
includes = [
|
||||
@@ -31,7 +32,7 @@ def build(bld):
|
||||
|
||||
defines = []
|
||||
|
||||
libs = ['tier0','tier1','tier2','tier3','vstdlib','steam_api','appframework','sdl2','togl','LOG']
|
||||
libs = ['tier0','tier1','tier2','tier3','vstdlib','steam_api','appframework','SDL2','togl']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
|
||||
Reference in New Issue
Block a user