77#include < dlfcn.h>
88#include < android/log.h>
99#include " internal/AndroidUtils.h"
10- #include " internal/ModManager.h"
1110#include " Logger.h"
1211#include " PreloaderInput.h"
12+ #include " pl/internal/Macro.h"
1313
14- pl::log::Logger logger (" NativeLoader" );
14+ pl::log::Logger logger (" Preloader" );
15+ using LoadFunc = void (*)(JavaVM *);
1516
1617static std::vector<PreloaderInput_OnTouch_Fn> g_touchCallbacks;
1718static std::mutex g_callbackMutex;
@@ -28,6 +29,13 @@ static void (*androidMain)(struct android_app*) = nullptr;
2829
2930extern " C" {
3031
32+ PLCAPI std::string getModsDir () {
33+ return g_modsDir;
34+ }
35+
36+ PLCAPI std::string getCacheDir () {
37+ return g_cacheDir;
38+ }
3139
3240JNIEXPORT void ANativeActivity_onCreate (ANativeActivity* activity, void * savedState, size_t savedStateSize) {
3341 if (onCreate) {
@@ -65,9 +73,9 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
6573}
6674
6775JNIEXPORT void JNICALL
68- Java_org_levimc_launcher_core_minecraft_MinecraftActivity_nativeOnLauncherLoaded (
76+ Java_org_levimc_launcher_core_mods_ModManager_nativeOnLaunched (
6977 JNIEnv* env,
70- jobject thiz ,
78+ jclass clazz ,
7179 jstring libPath
7280) {
7381 const char * path = env->GetStringUTFChars (libPath, nullptr );
@@ -89,37 +97,34 @@ Java_org_levimc_launcher_core_minecraft_MinecraftActivity_nativeOnLauncherLoaded
8997 logger.debug (" Successfully loaded Minecraft native functions" );
9098 }
9199 env->ReleaseStringUTFChars (libPath, path);
92- if (!g_modsInitialized && !g_modsDir.empty ()) {
93- ModManager::LoadAndInitializeEnabledMods (g_modsDir, g_cacheDir, g_vm);
94- g_modsInitialized = true ;
95- logger.debug (" Mods initialized successfully" );
96- }
97100}
98101
99- JNIEXPORT void JNICALL
100- Java_org_levimc_launcher_core_minecraft_MinecraftLauncher_nativeOnLauncherLoaded (
101- JNIEnv* env,
102- jobject thiz,
103- jstring libPath
104- ) {
105-
106-
107- Java_org_levimc_launcher_core_minecraft_MinecraftActivity_nativeOnLauncherLoaded (env, thiz, libPath);
102+ JNIEXPORT jboolean JNICALL Java_org_levimc_launcher_core_mods_ModManager_nativeLoadMod (JNIEnv* env, jclass clazz, jstring libPath) {
103+ const char * path = env->GetStringUTFChars (libPath, nullptr );
104+ if (void *handle = dlopen (path, RTLD_NOW)) {
105+ LoadFunc func = (LoadFunc)dlsym (handle, " LeviMod_Load" );
106+ if (func) {
107+ func (vm);
108+ }
109+ } else {
110+ logger.error (" failed to load mod: %s" , path);
111+ return JNI_FALSE;
112+ }
113+ env->ReleaseStringUTFChars (libPath, path);
114+ logger.info (" successful loading mod: %s" , path);
115+ return JNI_TRUE;
108116}
109117
118+ JNIEXPORT jboolean JNICALL Java_org_levimc_launcher_preloader_PreloaderInput_nativeOnTouch (JNIEnv* env, jclass clazz, jint action, jint pointerId, jfloat x, jfloat y) {
110119
111-
112- JNIEXPORT jboolean JNICALL Java_org_levimc_launcher_preloader_PreloaderInput_nativeOnTouch (
113- JNIEnv* env, jclass clazz, jint action, jint pointerId, jfloat x, jfloat y) {
114-
115- std::lock_guard<std::mutex> lock (g_callbackMutex);
116- bool consumed = false ;
117- for (auto callback : g_touchCallbacks) {
118- if (callback) {
119- consumed |= callback (action, pointerId, x, y);
120- }
121- }
122- return consumed ? JNI_TRUE : JNI_FALSE;
120+ std::lock_guard<std::mutex> lock (g_callbackMutex);
121+ bool consumed = false ;
122+ for (auto callback : g_touchCallbacks) {
123+ if (callback) {
124+ consumed |= callback (action, pointerId, x, y);
125+ }
126+ }
127+ return consumed ? JNI_TRUE : JNI_FALSE;
123128}
124129
125130static void RegisterTouchCallback (PreloaderInput_OnTouch_Fn callback) {
@@ -132,7 +137,7 @@ static PreloaderInput_Interface g_inputInterface = {
132137 .RegisterTouchCallback = RegisterTouchCallback
133138};
134139
135- __attribute__ ((visibility( " default " ))) PreloaderInput_Interface* GetPreloaderInput() {
140+ PLCAPI PreloaderInput_Interface* GetPreloaderInput () {
136141 return &g_inputInterface;
137142}
138143
0 commit comments