Skip to content

Commit 9bb8e1d

Browse files
committed
refactor: input system overhaul, GL debug panel, IME callback bridge
- Add FontAwesome embedded resource (fa-solid-900.ttf) - Implement KeyboardView-based IME with nativeSendChar/nativeSendKey callbacks - Remove initializeKeyEvent hook; key events now flow through C→C# callback - Add GL debug panel with caps toggles, blend/depth/cull params, Info tab - Add rainbow text shader (HSL gradient, merges with font atlas) - Add UI scale / scrollbar width / slider size controls - Fix UnmanagedCallersOnly out/ref parameter violations - Fix SIGBUS from per-frame FindViaClassLoader (cache JavaClass singleton) - Update GET_STARTED.md: Runtime/ directory not in repo, document external deps
1 parent 928d911 commit 9bb8e1d

60 files changed

Lines changed: 4917 additions & 1536 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ TestAndroidProject/
4646
TestAndroidProject2/
4747

4848
# Runtime data (mods, etc — user-managed)
49-
Runtime/
49+
/Runtime/
5050

5151
# Gradle-copied assets (generated by build)
5252
**/src/main/assets/*.dll

‎Android/build.gradle‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Top-level build file for StArray.ModLoader Android AAR library
1+
// Top-level build file for StArray.ModManager Android AAR library
22
plugins {
33
id 'com.android.library' version '8.10.0' apply false
44
}

‎Android/library/build.gradle‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins {
33
}
44

55
android {
6-
namespace 'starray.android.modloader'
6+
namespace 'starray.android.modmanager'
77
compileSdk 35
88
ndkVersion "27.2.12479018"
99

‎Android/library/consumer-rules.pro‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
# Consumer ProGuard rules for StArray.ModLoader AAR library.
1+
# Consumer ProGuard rules for StArray.ModManager AAR library.
22
# These rules are included when the AAR is consumed by an application.
33
# See https://developer.android.com/studio/projects/android-library#considerations
44

5-
# Keep ModLoader public API
6-
-keep class starray.android.modloader.ModLoader {
5+
# Keep ModManager public API
6+
-keep class starray.android.modmanager.ModManager {
77
public *;
88
}
9-
-keep class starray.android.modloader.ModLoaderNative {
9+
-keep class starray.android.modmanager.ModManagerNative {
1010
native <methods>;
1111
}

‎Android/library/proguard-rules.pro‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
native <methods>;
88
}
99

10-
# Keep ModLoader API
11-
-keep class starray.android.modloader.** { *; }
10+
# Keep ModManager API
11+
-keep class starray.android.modmanager.** { *; }

‎Android/library/src/main/AndroidManifest.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<application>
77
<meta-data
8-
android:name="starray.modloader.version"
8+
android:name="starray.modmanager.version"
99
android:value="1.0.0" />
1010
</application>
1111

‎Android/library/src/main/cpp/CMakeLists.txt‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
cmake_minimum_required(VERSION 3.22.1)
33

44
# Project name and version
5-
project("modloader" VERSION 1.0.0 LANGUAGES C CXX)
5+
project("modmanager" VERSION 1.0.0 LANGUAGES C CXX)
66

77
# ---- Build options ----
88
set(CMAKE_C_STANDARD 11)
@@ -21,7 +21,7 @@ endif()
2121
add_compile_options(-Wno-deprecated-declarations)
2222

2323
# ---- Source files ----
24-
set(MODLOADER_SOURCES
24+
set(MODMANAGER_SOURCES
2525
core/dobby_hook.cpp
2626
core/unity_resolve.cpp
2727
core/jni_helper.c
@@ -31,8 +31,8 @@ set(MONODROID_SOURCES
3131
core/mono_droid_coreclr.c
3232
)
3333

34-
# ---- libmodloader.so (Dobby + UnityResolve + log_write) ----
35-
add_library(modloader SHARED ${MODLOADER_SOURCES})
34+
# ---- libmodmanager.so (Dobby + UnityResolve + log_write) ----
35+
add_library(modmanager SHARED ${MODMANAGER_SOURCES})
3636

3737
# ---- libmonodroid.so (CoreCLR JNI host) ----
3838
add_library(monodroid SHARED ${MONODROID_SOURCES})
@@ -84,8 +84,8 @@ set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES
8484
"${CIMGUI_DIR}/.backends_patched"
8585
)
8686

87-
# ---- Include directories (modloader) ----
88-
target_include_directories(modloader
87+
# ---- Include directories (modmanager) ----
88+
target_include_directories(modmanager
8989
PRIVATE
9090
${CMAKE_CURRENT_SOURCE_DIR}
9191
${CMAKE_CURRENT_SOURCE_DIR}/core
@@ -102,22 +102,22 @@ target_include_directories(monodroid
102102
${CMAKE_CURRENT_SOURCE_DIR}/libs/coreclr/include
103103
)
104104

105-
# ---- Link libraries (modloader) ----
105+
# ---- Link libraries (modmanager) ----
106106
find_library(log-lib log)
107107

108-
target_link_libraries(modloader
108+
target_link_libraries(modmanager
109109
${log-lib}
110110
dobby
111111
cimgui
112112
android
113113
)
114114

115-
# ---- Post-build: copy libcimgui.so alongside libmodloader.so ----
116-
add_custom_command(TARGET modloader POST_BUILD
115+
# ---- Post-build: copy libcimgui.so alongside libmodmanager.so ----
116+
add_custom_command(TARGET modmanager POST_BUILD
117117
COMMAND ${CMAKE_COMMAND} -E copy_if_different
118118
"$<TARGET_FILE:cimgui>"
119-
"$<TARGET_FILE_DIR:modloader>/libcimgui.so"
120-
COMMENT "Copying libcimgui.so to modloader output"
119+
"$<TARGET_FILE_DIR:modmanager>/libcimgui.so"
120+
COMMENT "Copying libcimgui.so to modmanager output"
121121
)
122122

123123
# ---- Link libraries (monodroid) ----

‎Android/library/src/main/cpp/core/dobby_hook.cpp‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55
#include <dobby.h>
66

7-
#define LOG_TAG "StArray.ModLoader.Dobby"
7+
#define LOG_TAG "StArray.ModManager.Dobby"
88
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
99
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
1010

1111
// ============================================================================
1212
// C ABI exports for P/Invoke from C# (Mono)
13-
// 命名规范: modloader_dobby_xxx
14-
// C# 通过 [DllImport("modloader")] 直接调用
13+
// 命名规范: modmanager_dobby_xxx
14+
// C# 通过 [DllImport("modmanager")] 直接调用
1515
// ============================================================================
1616
extern "C" {
1717

@@ -22,7 +22,7 @@ extern "C" {
2222
* @param origin_func [out] 保存原函数地址的指针
2323
* @return 0 成功,非 0 失败
2424
*/
25-
int modloader_dobby_hook(void *address, void *replace_func, void **origin_func) {
25+
int modmanager_dobby_hook(void *address, void *replace_func, void **origin_func) {
2626
LOGI("DobbyHook at %p, replace=%p", address, replace_func);
2727
int ret = DobbyHook(address, (dobby_dummy_func_t)replace_func, (dobby_dummy_func_t *)origin_func);
2828
if (ret != 0) LOGE("DobbyHook failed at %p, ret=%d", address, ret);
@@ -35,7 +35,7 @@ int modloader_dobby_hook(void *address, void *replace_func, void **origin_func)
3535
* @param pre_handler 前置回调 (dobby_instrument_callback_t)
3636
* @return 0 成功
3737
*/
38-
int modloader_dobby_instrument(void *address, void *pre_handler) {
38+
int modmanager_dobby_instrument(void *address, void *pre_handler) {
3939
LOGI("DobbyInstrument at %p, handler=%p", address, pre_handler);
4040
return DobbyInstrument(address, (dobby_instrument_callback_t)pre_handler);
4141
}
@@ -45,7 +45,7 @@ int modloader_dobby_instrument(void *address, void *pre_handler) {
4545
* @param address 被 hook 的函数地址
4646
* @return 0 成功
4747
*/
48-
int modloader_dobby_destroy(void *address) {
48+
int modmanager_dobby_destroy(void *address) {
4949
LOGI("DobbyDestroy at %p", address);
5050
return DobbyDestroy(address);
5151
}
@@ -56,7 +56,7 @@ int modloader_dobby_destroy(void *address) {
5656
* @param symbol_name 符号名
5757
* @return 符号地址,失败返回 nullptr
5858
*/
59-
void *modloader_dobby_symbol_resolver(const char *image_name, const char *symbol_name) {
59+
void *modmanager_dobby_symbol_resolver(const char *image_name, const char *symbol_name) {
6060
void *addr = DobbySymbolResolver(image_name, symbol_name);
6161
LOGI("DobbySymbolResolver(%s, %s) = %p", image_name, symbol_name, addr);
6262
return addr;
@@ -69,24 +69,24 @@ void *modloader_dobby_symbol_resolver(const char *image_name, const char *symbol
6969
* @param buffer_size 补丁数据大小
7070
* @return 0 成功
7171
*/
72-
int modloader_dobby_code_patch(void *address, const uint8_t *buffer, uint32_t buffer_size) {
72+
int modmanager_dobby_code_patch(void *address, const uint8_t *buffer, uint32_t buffer_size) {
7373
LOGI("DobbyCodePatch at %p, size=%u", address, buffer_size);
7474
return DobbyCodePatch(address, (uint8_t *)buffer, buffer_size);
7575
}
7676

7777
/**
7878
* DobbyGetVersion — 获取 Dobby 版本字符串。
7979
*/
80-
const char *modloader_dobby_get_version(void) {
80+
const char *modmanager_dobby_get_version(void) {
8181
return DobbyGetVersion();
8282
}
8383

8484
/**
85-
* modloader_log_write — write a line to Android logcat.
86-
* Called from C# via [DllImport("modloader")].
85+
* modmanager_log_write — write a line to Android logcat.
86+
* Called from C# via [DllImport("modmanager")].
8787
*/
88-
void modloader_log_write(int prio, const char *tag, const char *msg) {
89-
__android_log_write(prio, tag ? tag : "ModLoader", msg ? msg : "");
88+
void modmanager_log_write(int prio, const char *tag, const char *msg) {
89+
__android_log_write(prio, tag ? tag : "ModManager", msg ? msg : "");
9090
}
9191

9292
} // extern "C"

‎Android/library/src/main/cpp/core/jni_helper.c‎

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ static DataSlot* find_slot(const char *key) {
644644

645645
/** Java → C: nativeSetData(String key, int[] data) */
646646
JNIEXPORT void JNICALL
647-
Java_starray_android_modloader_ModManagerUtils_nativeSetData(
647+
Java_starray_android_modmanager_ModManagerUtils_nativeSetData(
648648
JNIEnv *env, jclass unused, jstring key, jintArray data) {
649649
const char *k = (*env)->GetStringUTFChars(env, key, NULL);
650650
DataSlot *s = find_slot(k);
@@ -664,7 +664,7 @@ Java_starray_android_modloader_ModManagerUtils_nativeSetData(
664664

665665
/** Java ← C: nativeGetData(String key) → int[] */
666666
JNIEXPORT jintArray JNICALL
667-
Java_starray_android_modloader_ModManagerUtils_nativeGetData(
667+
Java_starray_android_modmanager_ModManagerUtils_nativeGetData(
668668
JNIEnv *env, jclass unused, jstring key) {
669669
const char *k = (*env)->GetStringUTFChars(env, key, NULL);
670670
DataSlot *s = find_slot(k);
@@ -701,6 +701,52 @@ jint* jnihelper_get_data_buf(const char *key) {
701701
return s ? s->buf : NULL;
702702
}
703703

704+
// ===== C# 回调注册(Java nativeSendChar → C → C# callback) =====
705+
706+
typedef void (*onAcceptChar_cb)(unsigned int codepoint);
707+
static onAcceptChar_cb g_onAcceptChar;
708+
709+
void modmanager_set_OnAcceptCharCallback(onAcceptChar_cb callback) {
710+
g_onAcceptChar = callback;
711+
}
712+
713+
typedef void (*onAcceptKey_cb)(int keyCode);
714+
static onAcceptKey_cb g_onAcceptKey;
715+
716+
void modmanager_set_OnAcceptKeyCallback(onAcceptKey_cb callback) {
717+
g_onAcceptKey = callback;
718+
}
719+
720+
// === 实时 IME 字符注入 (KeyboardView → commitText → nativeSendChar) ===
721+
722+
JNIEXPORT void JNICALL
723+
Java_starray_android_modmanager_ModManagerUtils_nativeSendChar(
724+
JNIEnv *env, jclass unused, jint unicode) {
725+
// 优先走 C# 回调(实时),未注册时回退到 buffer
726+
if (g_onAcceptChar) {
727+
g_onAcceptChar((unsigned int)unicode);
728+
return;
729+
}
730+
DataSlot *s = find_slot("ime_text");
731+
if (!s) return;
732+
if (s->len >= DATA_BUF_SIZE) return;
733+
s->buf[s->len++] = unicode;
734+
}
735+
736+
JNIEXPORT void JNICALL
737+
Java_starray_android_modmanager_ModManagerUtils_nativeSendKey(
738+
JNIEnv *env, jclass unused, jint keyCode) {
739+
// 优先走 C# 回调(实时),未注册时回退到 buffer
740+
if (g_onAcceptKey) {
741+
g_onAcceptKey(keyCode);
742+
return;
743+
}
744+
DataSlot *s = find_slot("ime_text");
745+
if (!s) return;
746+
if (s->len >= DATA_BUF_SIZE) return;
747+
s->buf[s->len++] = -keyCode;
748+
}
749+
704750
/**
705751
* JNI_OnLoad - 库加载时的入口点
706752
*/

0 commit comments

Comments
 (0)