refactor clash bridge
This commit is contained in:
12 files changed
+157
-9
No files matched your search
@@ -8,4 +8,4 @@ include_directories(${CLASH_OUTPUT}/${ANDROID_ABI} ${CLASH_SOURCE})
|
||||
link_directories(${CLASH_OUTPUT}/${CMAKE_ANDROID_ARCH_ABI})
|
||||
link_libraries(log clash)
|
||||
|
||||
add_library(bridge SHARED main.cpp main.h init.cpp query.cpp patch.cpp tun.cpp defer.cpp event_queue.cpp)
|
||||
add_library(bridge SHARED main.cpp main.h init.cpp query.cpp patch.cpp tun.cpp defer.cpp log.cpp event_queue.cpp)
|
||||
@@ -0,0 +1,51 @@
|
||||
#include "libclash.h"
|
||||
#include "main.h"
|
||||
|
||||
static jobject logCallback;
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_github_kr328_clash_core_bridge_Bridge_setLogCallback(JNIEnv *env, jclass clazz,
|
||||
jobject callback) {
|
||||
UNUSED(clazz);
|
||||
|
||||
Master::runWithContext<void>(env, [&](Master::Context *context) {
|
||||
if ( logCallback != nullptr )
|
||||
context->removeGlobalReference(logCallback);
|
||||
|
||||
if ( callback == nullptr ) {
|
||||
logCallback = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
logCallback = context->newGlobalReference(callback);
|
||||
|
||||
EventQueue::getInstance()->registerHandler(LOG_RECEIVED, 0, [](const event_t *event) {
|
||||
Master::runWithAttached<int>([&](JNIEnv *env) {
|
||||
Master::runWithContext<void>(env, [&](Master::Context *context) {
|
||||
context->logCallbackMessage(logCallback, event->payload);
|
||||
});
|
||||
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_github_kr328_clash_core_bridge_Bridge_enableLogReport(JNIEnv *env, jclass clazz) {
|
||||
UNUSED(env);
|
||||
UNUSED(clazz);
|
||||
|
||||
enableLogReport();
|
||||
}
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_github_kr328_clash_core_bridge_Bridge_disableLogReport(JNIEnv *env, jclass clazz) {
|
||||
UNUSED(env);
|
||||
UNUSED(clazz);
|
||||
|
||||
disableLogReport();
|
||||
}
|
||||
@@ -16,7 +16,9 @@ Master::Master(JavaVM *vm, JNIEnv *env): vm(vm) {
|
||||
cCompletableFuture = g<jclass>(env, env->FindClass("java/util/concurrent/CompletableFuture"));
|
||||
cProxyGroup = g<jclass>(env, env->FindClass("com/github/kr328/clash/core/model/ProxyGroup"));
|
||||
cProxy = g<jclass>(env, env->FindClass("com/github/kr328/clash/core/model/Proxy"));
|
||||
cLogEvent = g<jclass>(env, env->FindClass("com/github/kr328/clash/core/event/LogEvent"));
|
||||
iTunCallback = g<jclass>(env, env->FindClass("com/github/kr328/clash/core/bridge/TunCallback"));
|
||||
iLogCallback = g<jclass>(env, env->FindClass("com/github/kr328/clash/core/bridge/LogCallback"));
|
||||
cClashExceptionConstructor = env->GetMethodID(cClashException, "<init>",
|
||||
"(Ljava/lang/String;)V");
|
||||
cTrafficConstructor = env->GetMethodID(cTraffic, "<init>", "(JJ)V");
|
||||
@@ -24,6 +26,7 @@ Master::Master(JavaVM *vm, JNIEnv *env): vm(vm) {
|
||||
cCompletableFutureConstructor = env->GetMethodID(cCompletableFuture, "<init>", "()V");
|
||||
cProxyGroupConstructor = env->GetMethodID(cProxyGroup, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Lcom/github/kr328/clash/core/model/Proxy;)V");
|
||||
cProxyConstructor = env->GetMethodID(cProxy, "<init>", "(Ljava/lang/String;Ljava/lang/String;J)V");
|
||||
cLogEventConstructor = env->GetMethodID(cLogEvent, "<init>", "(Ljava/lang/String;)V");
|
||||
mCompletableFutureComplete = env->GetMethodID(cCompletableFuture, "complete",
|
||||
"(Ljava/lang/Object;)Z");
|
||||
mCompletableFutureCompleteExceptionally = env->GetMethodID(cCompletableFuture,
|
||||
@@ -31,6 +34,7 @@ Master::Master(JavaVM *vm, JNIEnv *env): vm(vm) {
|
||||
"(Ljava/lang/Throwable;)Z");
|
||||
mTunCallbackOnNewSocket = env->GetMethodID(iTunCallback, "onNewSocket", "(I)V");
|
||||
mTunCallbackOnStop = env->GetMethodID(iTunCallback, "onStop", "()V");
|
||||
mLogCallbackOnMessage = env->GetMethodID(iLogCallback, "onMessage", "(Lcom/github/kr328/clash/core/event/LogEvent;)V");
|
||||
|
||||
sDirect = g<jstring>(env, env->NewStringUTF("Direct"));
|
||||
sReject = g<jstring>(env, env->NewStringUTF("Reject"));
|
||||
@@ -224,6 +228,12 @@ jobject Master::Context::createProxyGroup(char const *name, proxy_type_t type,
|
||||
return env->NewObject(master->cProxyGroup, master->cProxyGroupConstructor, env->NewStringUTF(name), ts, env->NewStringUTF(current), proxies);
|
||||
}
|
||||
|
||||
void Master::Context::logCallbackMessage(jobject callback, const char *data) {
|
||||
jobject event = env->NewObject(master->cLogEvent, master->cLogEventConstructor, env->NewStringUTF(data));
|
||||
|
||||
env->CallVoidMethod(callback, master->mLogCallbackOnMessage, event);
|
||||
}
|
||||
|
||||
static void enqueue_event(const event_t *e) {
|
||||
EventQueue::getInstance()->enqueueEvent(e);
|
||||
}
|
||||
|
||||
@@ -25,17 +25,21 @@ private:
|
||||
jclass cCompletableFuture;
|
||||
jclass cProxyGroup;
|
||||
jclass cProxy;
|
||||
jclass cLogEvent;
|
||||
jclass iTunCallback;
|
||||
jclass iLogCallback;
|
||||
jmethodID cClashExceptionConstructor;
|
||||
jmethodID cTrafficConstructor;
|
||||
jmethodID cGeneralConstructor;
|
||||
jmethodID cCompletableFutureConstructor;
|
||||
jmethodID cProxyGroupConstructor;
|
||||
jmethodID cProxyConstructor;
|
||||
jmethodID cLogEventConstructor;
|
||||
jmethodID mCompletableFutureComplete;
|
||||
jmethodID mCompletableFutureCompleteExceptionally;
|
||||
jmethodID mTunCallbackOnNewSocket;
|
||||
jmethodID mTunCallbackOnStop;
|
||||
jmethodID mLogCallbackOnMessage;
|
||||
|
||||
private:
|
||||
jstring sDirect;
|
||||
@@ -86,6 +90,7 @@ public:
|
||||
bool completeExceptionallyCompletableFuture(jobject completable, jthrowable throwable);
|
||||
void tunCallbackNewSocket(jobject callback, int fd);
|
||||
void tunCallbackStop(jobject callback);
|
||||
void logCallbackMessage(jobject callback, const char *data);
|
||||
|
||||
public:
|
||||
jobject createProxy(char const *name, proxy_type_t type, long delay);
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <android/log.h>
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_com_github_kr328_clash_core_bridge_Bridge_queryGeneral(JNIEnv *env, jclass clazz) {
|
||||
@@ -92,7 +90,7 @@ Java_com_github_kr328_clash_core_bridge_Bridge_queryProxyGroups(JNIEnv *env, jcl
|
||||
group_name,
|
||||
group->base.proxy_type,
|
||||
now,
|
||||
context->createProxyArray(group->proxies_size, jproxies);
|
||||
context->createProxyArray(group->proxies_size, jproxies));
|
||||
|
||||
delete[] jproxies;
|
||||
|
||||
|
||||
Reference in new issue
Block a user