void account_usage(const struct arguments *args, jint version, jint protocol, const char *daddr, jint dport, jint uid, jlong sent, jlong received) { #ifdef PROFILE_JNI float mselapsed; struct timeval start, end; gettimeofday(&start, NULL); #endif jclass clsService = (*args->env)->GetObjectClass(args->env, args->instance); const char *signature = "(Leu/faircode/netguard/Usage;)V"; if (midAccountUsage == NULL) midAccountUsage = jniGetMethodID(args->env, clsService, "accountUsage", signature); const char *usage = "eu/faircode/netguard/Usage"; if (midInitUsage == NULL) midInitUsage = jniGetMethodID(args->env, clsUsage, "<init>", "()V"); jobject jusage = jniNewObject(args->env, clsUsage, midInitUsage, usage); if (fidUsageTime == NULL) { const char *string = "Ljava/lang/String;"; fidUsageTime = jniGetFieldID(args->env, clsUsage, "Time", "J"); fidUsageVersion = jniGetFieldID(args->env, clsUsage, "Version", "I"); fidUsageProtocol = jniGetFieldID(args->env, clsUsage, "Protocol", "I"); fidUsageDAddr = jniGetFieldID(args->env, clsUsage, "DAddr", string); fidUsageDPort = jniGetFieldID(args->env, clsUsage, "DPort", "I"); fidUsageUid = jniGetFieldID(args->env, clsUsage, "Uid", "I"); fidUsageSent = jniGetFieldID(args->env, clsUsage, "Sent", "J"); fidUsageReceived = jniGetFieldID(args->env, clsUsage, "Received", "J"); } jlong jtime = time(NULL) * 1000LL; jstring jdaddr = (*args->env)->NewStringUTF(args->env, daddr); (*args->env)->SetLongField(args->env, jusage, fidUsageTime, jtime); (*args->env)->SetIntField(args->env, jusage, fidUsageVersion, version); (*args->env)->SetIntField(args->env, jusage, fidUsageProtocol, protocol); (*args->env)->SetObjectField(args->env, jusage, fidUsageDAddr, jdaddr); (*args->env)->SetIntField(args->env, jusage, fidUsageDPort, dport); (*args->env)->SetIntField(args->env, jusage, fidUsageUid, uid); (*args->env)->SetLongField(args->env, jusage, fidUsageSent, sent); (*args->env)->SetLongField(args->env, jusage, fidUsageReceived, received); (*args->env)->CallVoidMethod(args->env, args->instance, midAccountUsage, jusage); jniCheckException(args->env); (*args->env)->DeleteLocalRef(args->env, jdaddr); (*args->env)->DeleteLocalRef(args->env, jusage); (*args->env)->DeleteLocalRef(args->env, clsService); #ifdef PROFILE_JNI gettimeofday(&end, NULL); mselapsed = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; if (mselapsed > PROFILE_JNI) log_android(ANDROID_LOG_WARN, "log_packet %f", mselapsed); #endif }
void dns_resolved(const struct arguments *args, const char *qname, const char *aname, const char *resource, int ttl) { #ifdef PROFILE_JNI float mselapsed; struct timeval start, end; gettimeofday(&start, NULL); #endif jclass clsService = (*args->env)->GetObjectClass(args->env, args->instance); const char *signature = "(Leu/faircode/netguard/ResourceRecord;)V"; if (midDnsResolved == NULL) midDnsResolved = jniGetMethodID(args->env, clsService, "dnsResolved", signature); const char *rr = "eu/faircode/netguard/ResourceRecord"; if (midInitRR == NULL) midInitRR = jniGetMethodID(args->env, clsRR, "<init>", "()V"); jobject jrr = jniNewObject(args->env, clsRR, midInitRR, rr); if (fidQTime == NULL) { const char *string = "Ljava/lang/String;"; fidQTime = jniGetFieldID(args->env, clsRR, "Time", "J"); fidQName = jniGetFieldID(args->env, clsRR, "QName", string); fidAName = jniGetFieldID(args->env, clsRR, "AName", string); fidResource = jniGetFieldID(args->env, clsRR, "Resource", string); fidTTL = jniGetFieldID(args->env, clsRR, "TTL", "I"); } jlong jtime = time(NULL) * 1000LL; jstring jqname = (*args->env)->NewStringUTF(args->env, qname); jstring janame = (*args->env)->NewStringUTF(args->env, aname); jstring jresource = (*args->env)->NewStringUTF(args->env, resource); (*args->env)->SetLongField(args->env, jrr, fidQTime, jtime); (*args->env)->SetObjectField(args->env, jrr, fidQName, jqname); (*args->env)->SetObjectField(args->env, jrr, fidAName, janame); (*args->env)->SetObjectField(args->env, jrr, fidResource, jresource); (*args->env)->SetIntField(args->env, jrr, fidTTL, ttl); (*args->env)->CallVoidMethod(args->env, args->instance, midDnsResolved, jrr); jniCheckException(args->env); (*args->env)->DeleteLocalRef(args->env, jresource); (*args->env)->DeleteLocalRef(args->env, janame); (*args->env)->DeleteLocalRef(args->env, jqname); (*args->env)->DeleteLocalRef(args->env, jrr); (*args->env)->DeleteLocalRef(args->env, clsService); #ifdef PROFILE_JNI gettimeofday(&end, NULL); mselapsed = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; if (mselapsed > PROFILE_JNI) log_android(ANDROID_LOG_WARN, "log_packet %f", mselapsed); #endif }
jboolean is_domain_blocked(const struct arguments *args, const char *name) { #ifdef PROFILE_JNI float mselapsed; struct timeval start, end; gettimeofday(&start, NULL); #endif jclass clsService = (*args->env)->GetObjectClass(args->env, args->instance); const char *signature = "(Ljava/lang/String;)Z"; if (midIsDomainBlocked == NULL) midIsDomainBlocked = jniGetMethodID(args->env, clsService, "isDomainBlocked", signature); jstring jname = (*args->env)->NewStringUTF(args->env, name); jboolean jallowed = (*args->env)->CallBooleanMethod( args->env, args->instance, midIsDomainBlocked, jname); jniCheckException(args->env); (*args->env)->DeleteLocalRef(args->env, jname); (*args->env)->DeleteLocalRef(args->env, clsService); #ifdef PROFILE_JNI gettimeofday(&end, NULL); mselapsed = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; if (mselapsed > PROFILE_JNI) log_android(ANDROID_LOG_WARN, "is_domain_blocked %f", mselapsed); #endif return jallowed; }
void log_packet(const struct arguments *args, jobject jpacket) { #ifdef PROFILE_JNI float mselapsed; struct timeval start, end; gettimeofday(&start, NULL); #endif jclass clsService = (*args->env)->GetObjectClass(args->env, args->instance); const char *signature = "(Leu/faircode/netguard/Packet;)V"; if (midLogPacket == NULL) midLogPacket = jniGetMethodID(args->env, clsService, "logPacket", signature); (*args->env)->CallVoidMethod(args->env, args->instance, midLogPacket, jpacket); jniCheckException(args->env); (*args->env)->DeleteLocalRef(args->env, clsService); (*args->env)->DeleteLocalRef(args->env, jpacket); #ifdef PROFILE_JNI gettimeofday(&end, NULL); mselapsed = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; if (mselapsed > PROFILE_JNI) log_android(ANDROID_LOG_WARN, "log_packet %f", mselapsed); #endif }
Primitive( const char* javaClassSpec, const char* staticBoxMethod, const char* staticBoxMethodSignature, const char* unboxMethod, const char* unboxMethodSignature) : clazz(jniFindClass(javaClassSpec)), method_box(jniGetStaticMethodID(clazz.get(), staticBoxMethod, staticBoxMethodSignature)), method_unbox(jniGetMethodID(clazz.get(), unboxMethod, unboxMethodSignature)) {}
struct allowed *is_address_allowed(const struct arguments *args, jobject jpacket) { #ifdef PROFILE_JNI float mselapsed; struct timeval start, end; gettimeofday(&start, NULL); #endif jclass clsService = (*args->env)->GetObjectClass(args->env, args->instance); const char *signature = "(Leu/faircode/netguard/Packet;)Leu/faircode/netguard/Allowed;"; if (midIsAddressAllowed == NULL) midIsAddressAllowed = jniGetMethodID(args->env, clsService, "isAddressAllowed", signature); jobject jallowed = (*args->env)->CallObjectMethod( args->env, args->instance, midIsAddressAllowed, jpacket); jniCheckException(args->env); if (jallowed != NULL) { if (fidRaddr == NULL) { const char *string = "Ljava/lang/String;"; fidRaddr = jniGetFieldID(args->env, clsAllowed, "raddr", string); fidRport = jniGetFieldID(args->env, clsAllowed, "rport", "I"); } jstring jraddr = (*args->env)->GetObjectField(args->env, jallowed, fidRaddr); if (jraddr == NULL) *allowed.raddr = 0; else { const char *raddr = (*args->env)->GetStringUTFChars(args->env, jraddr, NULL); strcpy(allowed.raddr, raddr); (*args->env)->ReleaseStringUTFChars(args->env, jraddr, raddr); } allowed.rport = (uint16_t) (*args->env)->GetIntField(args->env, jallowed, fidRport); (*args->env)->DeleteLocalRef(args->env, jraddr); } (*args->env)->DeleteLocalRef(args->env, jpacket); (*args->env)->DeleteLocalRef(args->env, clsService); (*args->env)->DeleteLocalRef(args->env, jallowed); #ifdef PROFILE_JNI gettimeofday(&end, NULL); mselapsed = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; if (mselapsed > PROFILE_JNI) log_android(ANDROID_LOG_WARN, "is_address_allowed %f", mselapsed); #endif return (jallowed == NULL ? NULL : &allowed); }
int protect_socket(const struct arguments *args, int socket) { jclass cls = (*args->env)->GetObjectClass(args->env, args->instance); if (midProtect == NULL) midProtect = jniGetMethodID(args->env, cls, "protect", "(I)Z"); jboolean isProtected = (*args->env)->CallBooleanMethod( args->env, args->instance, midProtect, socket); jniCheckException(args->env); if (!isProtected) { log_android(ANDROID_LOG_ERROR, "protect socket failed"); return -1; } (*args->env)->DeleteLocalRef(args->env, cls); return 0; }
void report_error(const struct arguments *args, jint error, const char *fmt, ...) { jclass cls = (*args->env)->GetObjectClass(args->env, args->instance); jmethodID mid = jniGetMethodID(args->env, cls, "nativeError", "(ILjava/lang/String;)V"); jstring jreason = NULL; if (fmt != NULL) { char line[1024]; va_list argptr; va_start(argptr, fmt); vsprintf(line, fmt, argptr); jreason = (*args->env)->NewStringUTF(args->env, line); va_end(argptr); } (*args->env)->CallVoidMethod(args->env, args->instance, mid, error, jreason); jniCheckException(args->env); if (jreason != NULL) (*args->env)->DeleteLocalRef(args->env, jreason); (*args->env)->DeleteLocalRef(args->env, cls); }
JniEnum::JniEnum(const std::string & name) : m_clazz { jniFindClass(name.c_str()) }, m_staticmethValues { jniGetStaticMethodID(m_clazz.get(), "values", ("()[L" + name + ";").c_str()) }, m_methOrdinal { jniGetMethodID(m_clazz.get(), "ordinal", "()I") } {}
jobject create_packet(const struct arguments *args, jint version, jint protocol, const char *flags, const char *source, jint sport, const char *dest, jint dport, const char *data, jint uid, jboolean allowed) { JNIEnv *env = args->env; #ifdef PROFILE_JNI float mselapsed; struct timeval start, end; gettimeofday(&start, NULL); #endif /* jbyte b[] = {1,2,3}; jbyteArray ret = env->NewByteArray(3); env->SetByteArrayRegion (ret, 0, 3, b); */ const char *packet = "eu/faircode/netguard/Packet"; if (midInitPacket == NULL) midInitPacket = jniGetMethodID(env, clsPacket, "<init>", "()V"); jobject jpacket = jniNewObject(env, clsPacket, midInitPacket, packet); if (fidTime == NULL) { const char *string = "Ljava/lang/String;"; fidTime = jniGetFieldID(env, clsPacket, "time", "J"); fidVersion = jniGetFieldID(env, clsPacket, "version", "I"); fidProtocol = jniGetFieldID(env, clsPacket, "protocol", "I"); fidFlags = jniGetFieldID(env, clsPacket, "flags", string); fidSaddr = jniGetFieldID(env, clsPacket, "saddr", string); fidSport = jniGetFieldID(env, clsPacket, "sport", "I"); fidDaddr = jniGetFieldID(env, clsPacket, "daddr", string); fidDport = jniGetFieldID(env, clsPacket, "dport", "I"); fidData = jniGetFieldID(env, clsPacket, "data", string); fidUid = jniGetFieldID(env, clsPacket, "uid", "I"); fidAllowed = jniGetFieldID(env, clsPacket, "allowed", "Z"); } struct timeval tv; gettimeofday(&tv, NULL); jlong t = tv.tv_sec * 1000LL + tv.tv_usec / 1000; jstring jflags = (*env)->NewStringUTF(env, flags); jstring jsource = (*env)->NewStringUTF(env, source); jstring jdest = (*env)->NewStringUTF(env, dest); jstring jdata = (*env)->NewStringUTF(env, data); (*env)->SetLongField(env, jpacket, fidTime, t); (*env)->SetIntField(env, jpacket, fidVersion, version); (*env)->SetIntField(env, jpacket, fidProtocol, protocol); (*env)->SetObjectField(env, jpacket, fidFlags, jflags); (*env)->SetObjectField(env, jpacket, fidSaddr, jsource); (*env)->SetIntField(env, jpacket, fidSport, sport); (*env)->SetObjectField(env, jpacket, fidDaddr, jdest); (*env)->SetIntField(env, jpacket, fidDport, dport); (*env)->SetObjectField(env, jpacket, fidData, jdata); (*env)->SetIntField(env, jpacket, fidUid, uid); (*env)->SetBooleanField(env, jpacket, fidAllowed, allowed); (*env)->DeleteLocalRef(env, jdata); (*env)->DeleteLocalRef(env, jdest); (*env)->DeleteLocalRef(env, jsource); (*env)->DeleteLocalRef(env, jflags); // Caller needs to delete reference to packet #ifdef PROFILE_JNI gettimeofday(&end, NULL); mselapsed = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; if (mselapsed > PROFILE_JNI) log_android(ANDROID_LOG_WARN, "create_packet %f", mselapsed); #endif return jpacket; }