From 10bfa65a4ed50392a507127c3e0b728aeb2b5d70 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Sat, 11 Mar 2023 13:57:17 +0000 Subject: [PATCH] Fixed apps not working most of the time. Ultimately, storing a pointer to the database using JS_NewInt64 was lossy and a bad idea. Also, remove use of JNI since we're only starting tildefriends as its own process now. git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4215 ed5197a5-7fde-0310-b194-c3ffbd925b24 --- src/android/AndroidManifest.xml | 2 +- .../unprompted/tildefriends/MainActivity.java | 10 +++--- src/database.js.c | 21 ++++++----- src/database.js.h | 4 +-- src/jnitest.c | 23 ------------ src/main.c | 16 --------- src/ssb.import.c | 2 +- src/task.c | 35 +------------------ src/taskstub.js.c | 4 --- 9 files changed, 19 insertions(+), 98 deletions(-) delete mode 100644 src/jnitest.c diff --git a/src/android/AndroidManifest.xml b/src/android/AndroidManifest.xml index c6412284..c7255f74 100644 --- a/src/android/AndroidManifest.xml +++ b/src/android/AndroidManifest.xml @@ -5,7 +5,7 @@ versionName="0.0.4"> - + diff --git a/src/android/com/unprompted/tildefriends/MainActivity.java b/src/android/com/unprompted/tildefriends/MainActivity.java index 3a59cabb..abebe38e 100644 --- a/src/android/com/unprompted/tildefriends/MainActivity.java +++ b/src/android/com/unprompted/tildefriends/MainActivity.java @@ -53,7 +53,11 @@ public class MainActivity extends Activity { Log.w("tildefriends", e.toString()); } - ProcessBuilder builder = new ProcessBuilder(getFilesDir().toString() + "/tildefriends", "run", "-z", getPackageResourcePath().toString()); + ProcessBuilder builder = new ProcessBuilder( + getFilesDir().toString() + "/tildefriends", + "run", + "-z", + getPackageResourcePath().toString()); Log.w("tildefriends", "files = " + getFilesDir().toString()); builder.directory(getFilesDir()); builder.inheritIO(); @@ -83,8 +87,4 @@ public class MainActivity extends Activity { web.loadUrl("http://127.0.0.1:12345/~core/apps/"); } - - static { - System.loadLibrary("tildefriends"); - } } diff --git a/src/database.js.c b/src/database.js.c index 4feafe69..eaa69900 100644 --- a/src/database.js.c +++ b/src/database.js.c @@ -2,6 +2,8 @@ #include "log.h" #include "mem.h" +#include "ssb.h" +#include "task.h" #include #include @@ -31,7 +33,7 @@ static JSValue _database_get_all(JSContext* context, JSValueConst this_val, int static JSValue _database_get_like(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); static JSValue _databases_list(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv, int magic, JSValue* data); -void tf_database_register(JSContext* context, sqlite3* sqlite) +void tf_database_register(JSContext* context) { JS_NewClassID(&_database_class_id); JSClassDef def = @@ -45,13 +47,12 @@ void tf_database_register(JSContext* context, sqlite3* sqlite) } JSValue global = JS_GetGlobalObject(context); - JSValue data[] = { JS_NewInt64(context, (int64_t)(intptr_t)sqlite) }; - JSValue constructor = JS_NewCFunctionData(context, _database_create, 0, 0, 1, data); + JSValue constructor = JS_NewCFunctionData(context, _database_create, 0, 0, 0, NULL); JS_SetConstructorBit(context, constructor, true); JS_SetPropertyStr(context, global, "Database", constructor); JSValue databases = JS_NewObject(context); JS_SetPropertyStr(context, global, "databases", databases); - JS_SetPropertyStr(context, databases, "list", JS_NewCFunctionData(context, _databases_list, 0, 0, 1, data)); + JS_SetPropertyStr(context, databases, "list", JS_NewCFunctionData(context, _databases_list, 0, 0, 0, NULL)); JS_FreeValue(context, global); } @@ -60,9 +61,8 @@ static JSValue _database_create(JSContext* context, JSValueConst this_val, int a ++_database_count; JSValue object = JS_NewObjectClass(context, _database_class_id); - int64_t value = 0; - JS_ToInt64(context, &value, data[0]); - sqlite3* db = (sqlite3*)(intptr_t)value; + tf_task_t* task = tf_task_get(context); + sqlite3* db = tf_ssb_get_db(tf_task_get_ssb(task)); database_t* database = tf_malloc(sizeof(database_t)); *database = (database_t) @@ -105,7 +105,7 @@ static JSValue _database_get(JSContext* context, JSValueConst this_val, int argc if (database) { sqlite3_stmt* statement; - if (sqlite3_prepare(database->db, "SELECT value FROM properties WHERE id = $1 AND key = $2", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare(database->db, "SELECT value FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) { size_t length; const char* keyString = JS_ToCStringLen(context, &length, argv[0]); @@ -278,9 +278,8 @@ JSValue _database_get_like(JSContext* context, JSValueConst this_val, int argc, static JSValue _databases_list(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv, int magic, JSValue* data) { - int64_t value = 0; - JS_ToInt64(context, &value, data[0]); - sqlite3* db = (sqlite3*)(intptr_t)value; + tf_task_t* task = tf_task_get(context); + sqlite3* db = tf_ssb_get_db(tf_task_get_ssb(task)); JSValue array = JS_UNDEFINED; sqlite3_stmt* statement; diff --git a/src/database.js.h b/src/database.js.h index 20f17c3e..800c3c2f 100644 --- a/src/database.js.h +++ b/src/database.js.h @@ -2,6 +2,4 @@ #include "quickjs.h" -typedef struct sqlite3 sqlite3; - -void tf_database_register(JSContext* context, sqlite3* sqlite); +void tf_database_register(JSContext* context); diff --git a/src/jnitest.c b/src/jnitest.c deleted file mode 100644 index 80d5b813..00000000 --- a/src/jnitest.c +++ /dev/null @@ -1,23 +0,0 @@ -#if defined(__ANDROID__) -#include "log.h" - -#include -#include - -void tf_android(const char* apk_path); - -JNIEXPORT void JNICALL Java_com_unprompted_tildefriends_MainActivity_setFilesPath(JNIEnv* env, jobject obj, jstring files_path, jstring apk_path) -{ - tf_printf("setFilesPath called.\n"); - const char* path_string = (*env)->GetStringUTFChars(env, files_path, NULL); - tf_printf("files_path = %s\n", path_string); - int result = chdir(path_string); - tf_printf("chdir %s => %d\n", path_string, result); - (*env)->ReleaseStringUTFChars(env, files_path, path_string); - - const char* apk_path_string = (*env)->GetStringUTFChars(env, apk_path, NULL); - tf_printf("apk = %s\n", apk_path_string); - tf_android(apk_path_string); - (*env)->ReleaseStringUTFChars(env, apk_path, apk_path_string); -} -#endif diff --git a/src/main.c b/src/main.c index b2112118..5b6df570 100644 --- a/src/main.c +++ b/src/main.c @@ -745,19 +745,3 @@ done: tf_mem_shutdown(); return result; } - -static void _tf_android_thread(void* user_data) -{ - char* apk_path = user_data; - char* args[] = { "tildefriends", "run", "-z", apk_path }; - main(_countof(args), args); - tf_free(apk_path); -} - -void tf_android(const char* apk_path) -{ - uv_thread_t thread_id = 0; - tf_printf("Starting a thread.\n"); - uv_thread_create(&thread_id, _tf_android_thread, tf_strdup(apk_path)); - tf_printf("Post-thread start.\n"); -} diff --git a/src/ssb.import.c b/src/ssb.import.c index b6e87889..b26d8648 100644 --- a/src/ssb.import.c +++ b/src/ssb.import.c @@ -352,7 +352,7 @@ void tf_ssb_import_from_zip(tf_ssb_t* ssb, const char* zip_path, const char* use unzFile zip = unzOpen(zip_path); if (zip) { - tf_printf("Importing from %s.", zip_path); + tf_printf("Importing from %s.\n", zip_path); if (unzGoToFirstFile(zip) == UNZ_OK) { while (unzGoToNextFile(zip) == UNZ_OK) diff --git a/src/task.c b/src/task.c index fdd16747..9a07457b 100644 --- a/src/task.c +++ b/src/task.c @@ -1584,44 +1584,11 @@ static void _tf_task_trace_to_parent(tf_trace_t* trace, const char* buffer, size tf_packetstream_send(tf_taskstub_get_stream(task->_parent), kTaskTrace, buffer, size); } -#if defined(__ANDROID__) -static void _tf_task_extract_file(tf_task_t* task, const char* name, int mode) -{ - size_t size = 0; - char path_in_zip[256]; - snprintf(path_in_zip, sizeof(path_in_zip), "lib/arm64-v8a/%s", name); - const char* exe_source = _task_loadFile(task, path_in_zip, &size); - if (exe_source) - { - FILE* exe_target = fopen(name, "wb"); - if (exe_target) - { - fwrite(exe_source, size, 1, exe_target); - fchmod(fileno(exe_target), mode); - fclose(exe_target); - } - else - { - tf_printf("failed to open %s for write", name); - } - tf_free((void*)exe_source); - } - else - { - tf_printf("failed to read %s source", path_in_zip); - } -} -#endif - void tf_task_activate(tf_task_t* task) { assert(!task->_activated); task->_activated = true; -#if defined(__ANDROID__) - _tf_task_extract_file(task, "tildefriends", 0755); -#endif - JSContext* context = task->_context; JSValue global = JS_GetGlobalObject(context); JSValue e = JS_NewObject(context); @@ -1679,7 +1646,7 @@ void tf_task_activate(tf_task_t* task) JS_SetPropertyStr(context, global, "Socket", tf_socket_register(context)); JS_SetPropertyStr(context, global, "TlsContext", tf_tls_context_register(context)); tf_file_register(context); - tf_database_register(context, task->_db); + tf_database_register(context); task->_ssb = tf_ssb_create(&task->_loop, task->_context, task->_db_path); tf_ssb_set_trace(task->_ssb, task->_trace); diff --git a/src/taskstub.js.c b/src/taskstub.js.c index ec1c18a3..f44c6e50 100644 --- a/src/taskstub.js.c +++ b/src/taskstub.js.c @@ -45,10 +45,6 @@ void tf_taskstub_startup() JS_NewClassID(&_classId); size_t size = sizeof(_executable); uv_exepath(_executable, &size); -#if defined(__ANDROID__) - /* We have already changed into our files directory. */ - snprintf(_executable, sizeof(_executable), "./tildefriends"); -#endif tf_printf("exepath is %s\n", _executable); initialized = true; }