Skip to content

Commit

Permalink
Merge pull request #2 from alexbarry/dev
Browse files Browse the repository at this point in the history
Set root directory at runtime in Android
  • Loading branch information
alexbarry authored Apr 7, 2024
2 parents 0e6c4ff + 114c20a commit 09359e7
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ android {

defaultConfig {
applicationId "net.alexbarry.alexgames"
minSdkVersion 23
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName "1.0"
Expand Down
8 changes: 7 additions & 1 deletion src/android/app/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
cmake_minimum_required(VERSION 3.4.1)

# Not supported yet in the android native version. The web version embedded in the Android app should
# still support this, though.
set(ENABLE_ZIP_UPLOAD OFF CACHE BOOL "Enable the ability to upload custom games in zip files. Includes libzip and zlib." FORCE)

set(SRC_DIR "../../../../..")
# add_definitions(-DROOT_DIR="res/assets/")
# TODO I think this works now for testing...
Expand All @@ -8,7 +12,9 @@ set(SRC_DIR "../../../../..")
# on the Nexus 5X emulator, this path is the cache directory
# TODO I really need to set this at runtime
#add_definitions(-DROOT_DIR="/data/user/0/net.alexbarry.alexgames/cache/")
add_definitions(-DROOT_DIR="/data/user/0/net.alexbarry.alexgames/files/games/")
#add_definitions(-DROOT_DIR="/data/user/0/net.alexbarry.alexgames/files/games/")


add_definitions(-DLUA_USE_APICHECK)
# add_definitions(-DLUA_NOBUILTIN)
add_definitions(-DLUAI_ASSERT)
Expand Down
9 changes: 9 additions & 0 deletions src/android/app/src/main/cpp/alex_games_android_jni.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Java_net_alexbarry_alexgames_AlexGamesJni_jniHello( JNIEnv* env, jobject thiz );

JNIEXPORT void JNICALL
Java_net_alexbarry_alexgames_AlexGamesJni_jniInit(JNIEnv* env, jobject thiz,
jstring data_dir_path_jstr,
jstring game_id_jstr);
JNIEXPORT void JNICALL
Java_net_alexbarry_alexgames_AlexGamesJni_jniDrawBoard(JNIEnv* env, jobject thiz,
Expand Down Expand Up @@ -499,6 +500,7 @@ static const struct game_api_callbacks api = {

JNIEXPORT void JNICALL
Java_net_alexbarry_alexgames_AlexGamesJni_jniInit(JNIEnv* env, jobject thiz,
jstring data_dir_path_jstr,
jstring game_id_jstr) {
set_alex_log_func(alex_log);
set_alex_log_err_func(alex_log_err);
Expand All @@ -513,6 +515,13 @@ Java_net_alexbarry_alexgames_AlexGamesJni_jniInit(JNIEnv* env, jobject thiz,
log_jni("Could not find class AlexGames");
return;
}

jboolean is_copy;
const char *data_dir_path_cstr = (env)->GetStringUTFChars(data_dir_path_jstr, &is_copy);
alex_log("Setting alexgames root dir to data_dir_path = \"%s\"\n", data_dir_path_cstr);
alex_set_root_dir(data_dir_path_cstr);
(env)->ReleaseStringUTFChars(data_dir_path_jstr, data_dir_path_cstr);

L = alex_init_game(&api, game_id_cstr, (int)game_id_cstr_len);
if (L == NULL) {
log_jni("init_lua_api returned NULL");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.util.Log;
import android.view.MotionEvent;
import android.content.Context;

import net.alexbarry.alexgames.graphics.IAlexGamesCanvas;
import net.alexbarry.alexgames.popup.IAlexGamesPopupManager;
Expand Down Expand Up @@ -200,11 +201,18 @@ private void delete_timer(int handle) {
public native void jniHello();


public void init(final String game_id) {
public void init(Context context, final String game_id) {
runOnThread(new Runnable() {
@Override
public void run() {
jniInit(game_id);
//String data_dir_path = context.getCacheDir().getAbsolutePath();
String data_dir_path = context.getDataDir().getAbsolutePath();

// TODO this should probably be done in C
//data_dir_path += "/";
data_dir_path += "/files/games/";

jniInit(data_dir_path, game_id);
jniStartGame(0, null);
}
});
Expand All @@ -222,7 +230,7 @@ public void run() {
});
}

private native void jniInit(String game_id);
private native void jniInit(String data_dir_path, String game_id);
private native void jniDrawBoard(int dt_ms);
private native void jniHandleUserClicked(int pos_y, int pos_x);
private native void jniHandleMousemove(int pos_y, int pos_x, int buttons);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void init_alex_games(FragmentActivity activity, View view, ISendMsg send_
//String game_id = "minesweeper";
//game_id = "stick";
Log.i(TAG, String.format("initializing alexgames with game_id=\"%s\"", game_id));
alexGames.init(game_id);
alexGames.init(context, game_id);
alexGames.draw_board(0);

alexGamesCanvas.setOnTouchListener(new View.OnTouchListener() {
Expand Down
26 changes: 26 additions & 0 deletions src/game_api/game_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ extern const struct game_api *get_stick_api();
static void (*alexgames_mutex_take_ptr)(void) = NULL;
static void (*alexgames_mutex_release_ptr)(void) = NULL;

static bool g_root_dir_set = false;
static char g_root_dir[4096];

static log_func_t g_log_func = NULL;
static log_func_t g_log_func_err = NULL;

Expand Down Expand Up @@ -732,3 +735,26 @@ void alexgames_set_mutex_take_func(void (*func)(void)) {
void alexgames_set_mutex_release_func(void (*func)(void)) {
alexgames_mutex_release_ptr = func;
}

void alex_set_root_dir(const char *root_dir) {
strncpy(g_root_dir, root_dir, sizeof(g_root_dir));
g_root_dir_set = true;
}

int alex_get_root_dir(char *root_dir_out, size_t root_dir_out_len) {
int rc;
int str_len;
if (g_root_dir_set) {
rc = snprintf(root_dir_out, root_dir_out_len, "%s", g_root_dir);
str_len = strnlen(g_root_dir, sizeof(g_root_dir));
} else {
rc = snprintf(root_dir_out, root_dir_out_len, "%s", ROOT_DIR);
str_len = strlen(ROOT_DIR);
}

if (rc != str_len) {
return -1;
} else {
return 0;
}
}
6 changes: 6 additions & 0 deletions src/game_api/game_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,12 @@ struct game_api {
int alex_get_game_count();
const char *alex_get_game_name(int idx);

void alex_set_root_dir(const char *root_dir);
// TODO put internal functions like this in a separate header.
// need to distinguish between "functions called by lua_api.c" and
// "functions called by platform (wasm/wxWidgets/Android)
int alex_get_root_dir(char *scripts_dir_out, size_t scripts_dir_out_len);


void alex_set_status_err_vargs(const struct game_api_callbacks *api_callbacks, const char *format, ...);

Expand Down
28 changes: 24 additions & 4 deletions src/lua_api/lua_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ static int luaopen_alexdictlib(lua_State *L) {
#endif

//#define LUA_SCRIPT_DIR ROOT_DIR "src/lua_scripts"
#define LUA_SCRIPT_DIR ROOT_DIR ""
//#define LUA_SCRIPT_DIR ROOT_DIR ""

#define LUA_PRELOAD_DIR "preload/"

Expand Down Expand Up @@ -473,11 +473,20 @@ void *init_lua_game(const struct game_api_callbacks *api_callbacks_arg, const ch
//set_game_api(&lua_game_api);
api = api_callbacks_arg;

char lua_script_dir[4096];
{
int rc = alex_get_root_dir(lua_script_dir, sizeof(lua_script_dir));
if (rc) {
alex_log_err("Failed to get root dir");
return NULL;
}
}

char lua_fpath[1024];
lua_fpath[0] = '\0';
// TODO this doesn't actually protect against buffer overrun
// strlcat is better, I think, but I get linker errors when trying to use that in windows
strncat(lua_fpath, LUA_SCRIPT_DIR "", sizeof(lua_fpath)-1);
strncat(lua_fpath, lua_script_dir, sizeof(lua_fpath)-1);
strncat(lua_fpath, lua_fpath_arg, sizeof(lua_fpath)-1);

alex_log("[lua_init] Trying to load lua script at \"%s\"...\n", lua_fpath);
Expand Down Expand Up @@ -524,10 +533,21 @@ void *init_lua_game(const struct game_api_callbacks *api_callbacks_arg, const ch
//snprintf(new_path, sizeof(new_path), "%s;%s/?.lua", current_path, ROOT_DIR);
//snprintf(new_path, sizeof(new_path), "%s;%s/?.lua;%s/?.lua;%s/?.lua", current_path, LUA_SCRIPT_DIR, LUA_PRELOAD_DIR, LUA_UPLOAD_DIR);

char preload_path[4096];
{
char root_dir[4096];
int rc = alex_get_root_dir(root_dir, sizeof(root_dir));
if (rc) {
alex_log_err("Error getting root_dir");
return NULL;
}
snprintf(preload_path, sizeof(preload_path), "%s%s", root_dir, LUA_PRELOAD_DIR);
alex_log("[init] preload_path = \"%s\"\n", preload_path);
}
// TODO include the game's dirname() directory here
int new_path_len = snprintf(new_path, sizeof(new_path),
"%s;%s/?.lua;%s/?.lua;%s/?.lua;%s/?.lua",
current_path, LUA_SCRIPT_DIR, ROOT_DIR LUA_PRELOAD_DIR,
current_path, lua_script_dir, preload_path,
LUA_UPLOAD_DIR, GAME_UPLOAD_PATH);
if (new_path_len >= sizeof(new_path)) {
alex_log_err("Lua package.path too big, max size %d, actual %d\n", sizeof(new_path), new_path_len);
Expand All @@ -536,7 +556,7 @@ void *init_lua_game(const struct game_api_callbacks *api_callbacks_arg, const ch
return NULL;
}
lua_pop(L, 1);
alex_log("[lua_init] Including preload path: \"%s\"\n", ROOT_DIR LUA_PRELOAD_DIR);
alex_log("[lua_init] Including preload path: \"%s\"\n", preload_path);
alex_log("[lua_init] Including upload path: \"%s\"\n", GAME_UPLOAD_PATH);

lua_pushstring(L, new_path);
Expand Down

0 comments on commit 09359e7

Please sign in to comment.