From 31a371d3a76f80df501210b1b3ea59b86cfecbf1 Mon Sep 17 00:00:00 2001 From: Arslaan Pathan Date: Sun, 16 Aug 2026 20:33:17 +1200 Subject: [fix] use the activity's classloader to fix JNI and also create notification channel --- app/src/main/jni/main.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'app/src/main/jni/main.c') diff --git a/app/src/main/jni/main.c b/app/src/main/jni/main.c index 44f4a40..71d0f62 100644 --- a/app/src/main/jni/main.c +++ b/app/src/main/jni/main.c @@ -36,6 +36,43 @@ JNIEXPORT void JNICALL Java_com_arslaancodes_mokuassistant_AssistantService_stop LOGI("stopAssistant called"); } +void start_assistant_service(struct android_app *app) { + JNIEnv *env; + JavaVM *jvm = app->activity->vm; + + (*jvm)->AttachCurrentThread(jvm, &env, NULL); + + jclass activity_class = (*env)->GetObjectClass(env, app->activity->clazz); + + jmethodID get_class_loader = (*env)->GetMethodID(env, activity_class, "getClassLoader", "()Ljava/lang/ClassLoader;"); + jobject class_loader = (*env)->CallObjectMethod(env, app->activity->clazz, get_class_loader); + + jclass class_loader_cls = (*env)->FindClass(env, "java/lang/ClassLoader"); + jmethodID load_class = (*env)->GetMethodID(env, class_loader_cls, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); + + jstring class_name = (*env)->NewStringUTF(env, "com.arslaancodes.mokuassistant.AssistantService"); + jclass service_class = (jclass)(*env)->CallObjectMethod(env, class_loader, load_class, class_name); + (*env)->DeleteLocalRef(env, class_name); + + if (service_class == NULL) { + LOGE("Failed to find AssistantService class!"); + (*jvm)->DetachCurrentThread(jvm); + return; + } + + jmethodID start_service = (*env)->GetMethodID(env, activity_class, "startService", "(Landroid/content/Intent;)Landroid/content/ComponentName;"); + + jclass intent_class = (*env)->FindClass(env, "android/content/Intent"); + jmethodID intent_constructor = (*env)->GetMethodID(env, intent_class, "", "(Landroid/content/Context;Ljava/lang/Class;)V"); + jobject intent = (*env)->NewObject(env, intent_class, intent_constructor, app->activity->clazz, service_class); + + (*env)->CallObjectMethod(env, app->activity->clazz, start_service, intent); + + (*jvm)->DetachCurrentThread(jvm); + + LOGI("AssistantService started from C via JNI"); +} + enum Color { COLOR_RED = 0x000000ff, COLOR_GREEN = 0x0000ff00, @@ -215,7 +252,7 @@ void android_main(struct android_app *state) { state->userData = engine; state->onAppCmd = engine_handle_cmd; - /* do stuff here */ + start_assistant_service(state); while (!state->destroyRequested) { if (ALooper_pollAll(-1, NULL, &events, (void**)&source) >= 0) { -- cgit v1.2.3