mirror of
https://github.com/M66B/NetGuard.git
synced 2025-02-24 07:10:50 +00:00
JNI setup
This commit is contained in:
parent
93297fd4d0
commit
fc863c033b
4 changed files with 130 additions and 23 deletions
66
app/app.iml
66
app/app.iml
|
@ -8,15 +8,15 @@
|
||||||
</facet>
|
</facet>
|
||||||
<facet type="android" name="Android">
|
<facet type="android" name="Android">
|
||||||
<configuration>
|
<configuration>
|
||||||
<option name="SELECTED_BUILD_VARIANT" value="debug" />
|
<option name="SELECTED_BUILD_VARIANT" value="allDebug" />
|
||||||
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
|
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
|
||||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
<option name="ASSEMBLE_TASK_NAME" value="assembleAllDebug" />
|
||||||
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
|
<option name="COMPILE_JAVA_TASK_NAME" value="compileAllDebugSources" />
|
||||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
|
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleAllDebugAndroidTest" />
|
||||||
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
|
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileAllDebugAndroidTestSources" />
|
||||||
<afterSyncTasks>
|
<afterSyncTasks>
|
||||||
<task>generateDebugAndroidTestSources</task>
|
<task>generateAllDebugAndroidTestSources</task>
|
||||||
<task>generateDebugSources</task>
|
<task>generateAllDebugSources</task>
|
||||||
</afterSyncTasks>
|
</afterSyncTasks>
|
||||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||||
|
@ -27,22 +27,43 @@
|
||||||
</facet>
|
</facet>
|
||||||
</component>
|
</component>
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
|
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
|
||||||
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
|
<output url="file://$MODULE_DIR$/build/intermediates/classes/all/debug" />
|
||||||
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
|
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/all/debug" />
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/all/debug" isTestSource="false" generated="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/all/debug" isTestSource="false" generated="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/all/debug" isTestSource="false" generated="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/all/debug" isTestSource="false" generated="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/all/debug" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/all/debug" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/res" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/resources" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/assets" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/aidl" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/java" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/jni" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/renderscript" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/all/debug" isTestSource="true" generated="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/all/debug" isTestSource="true" generated="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/all/debug" isTestSource="true" generated="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/all/debug" isTestSource="true" generated="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/all/debug" type="java-test-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/all/debug" type="java-test-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/res" type="java-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/resources" type="java-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/assets" type="java-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/aidl" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/java" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/jni" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/all/renderscript" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/res" type="java-test-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/resources" type="java-test-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/assets" type="java-test-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/aidl" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/java" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/jni" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/rs" isTestSource="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
||||||
|
@ -65,6 +86,7 @@
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/renderscript" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/renderscript" isTestSource="true" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/binaries" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||||
|
@ -74,8 +96,8 @@
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/objectFiles" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
|
||||||
|
|
|
@ -14,12 +14,30 @@ model {
|
||||||
archivesBaseName = "NetGuard-v$versionName-$versionCode"
|
archivesBaseName = "NetGuard-v$versionName-$versionCode"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
android.ndk {
|
||||||
|
moduleName = "netguard"
|
||||||
|
toolchain = "clang"
|
||||||
|
ldLibs.add("log")
|
||||||
|
}
|
||||||
|
android.sources {
|
||||||
|
main {
|
||||||
|
jni {
|
||||||
|
source {
|
||||||
|
srcDir "src/main/jni"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
android.buildTypes {
|
android.buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled = true
|
minifyEnabled = true
|
||||||
proguardFiles.add(file('proguard-rules.pro'))
|
proguardFiles.add(file('proguard-rules.pro'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
android.productFlavors {
|
||||||
|
create("all") {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
|
@ -115,6 +115,14 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
|
||||||
|
|
||||||
private static final String ACTION_SCREEN_OFF_DELAYED = "eu.faircode.netguard.SCREEN_OFF_DELAYED";
|
private static final String ACTION_SCREEN_OFF_DELAYED = "eu.faircode.netguard.SCREEN_OFF_DELAYED";
|
||||||
|
|
||||||
|
private native void jni_init();
|
||||||
|
|
||||||
|
private native void jni_decode(byte[] buffer);
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.loadLibrary("netguard");
|
||||||
|
}
|
||||||
|
|
||||||
synchronized private static PowerManager.WakeLock getLock(Context context) {
|
synchronized private static PowerManager.WakeLock getLock(Context context) {
|
||||||
if (wlInstance == null) {
|
if (wlInstance == null) {
|
||||||
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||||
|
@ -675,6 +683,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
|
||||||
|
|
||||||
ByteBuffer buffer = ByteBuffer.allocate(32767);
|
ByteBuffer buffer = ByteBuffer.allocate(32767);
|
||||||
buffer.order(ByteOrder.BIG_ENDIAN);
|
buffer.order(ByteOrder.BIG_ENDIAN);
|
||||||
|
byte[] bytes = new byte[buffer.limit()];
|
||||||
|
|
||||||
Log.i(TAG, "Start receiving");
|
Log.i(TAG, "Start receiving");
|
||||||
while (!Thread.currentThread().isInterrupted() &&
|
while (!Thread.currentThread().isInterrupted() &&
|
||||||
|
@ -682,8 +691,10 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
|
||||||
pfd.getFileDescriptor().valid())
|
pfd.getFileDescriptor().valid())
|
||||||
try {
|
try {
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
int length = in.read(buffer.array());
|
int length = in.read(bytes);
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
|
buffer.put(bytes, 0, length);
|
||||||
|
buffer.position(0);
|
||||||
buffer.limit(length);
|
buffer.limit(length);
|
||||||
|
|
||||||
Packet pkt = new Packet(buffer);
|
Packet pkt = new Packet(buffer);
|
||||||
|
@ -691,6 +702,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
|
||||||
"/" + pkt.getDestinationPort() +
|
"/" + pkt.getDestinationPort() +
|
||||||
" " + pkt.getFlags() +
|
" " + pkt.getFlags() +
|
||||||
" " + pkt.getProtocol());
|
" " + pkt.getProtocol());
|
||||||
|
jni_decode(bytes);
|
||||||
|
|
||||||
int connection;
|
int connection;
|
||||||
if (last_connected)
|
if (last_connected)
|
||||||
|
@ -911,6 +923,9 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
|
||||||
ifPackage.addAction(Intent.ACTION_PACKAGE_ADDED);
|
ifPackage.addAction(Intent.ACTION_PACKAGE_ADDED);
|
||||||
ifPackage.addDataScheme("package");
|
ifPackage.addDataScheme("package");
|
||||||
registerReceiver(packageAddedReceiver, ifPackage);
|
registerReceiver(packageAddedReceiver, ifPackage);
|
||||||
|
|
||||||
|
// Native
|
||||||
|
jni_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
52
app/src/main/jni/netguard.c
Normal file
52
app/src/main/jni/netguard.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#include <jni.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <android/log.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <netinet/ip6.h>
|
||||||
|
|
||||||
|
#define TAG "NetGuard.JNI"
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_eu_faircode_netguard_SinkholeService_jni_1init(JNIEnv *env, jobject instance) {
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, TAG, "Init", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_eu_faircode_netguard_SinkholeService_jni_1decode(JNIEnv *env, jobject instance,
|
||||||
|
jbyteArray buffer_) {
|
||||||
|
jbyte *buffer = (*env)->GetByteArrayElements(env, buffer_, NULL);
|
||||||
|
jbyte version = (*buffer) >> 4;
|
||||||
|
|
||||||
|
if (version == 4) {
|
||||||
|
struct iphdr *ip4hdr = buffer;
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, TAG, "Version 4 protocol %d", ip4hdr->protocol);
|
||||||
|
}
|
||||||
|
else if (version == 6) {
|
||||||
|
struct ip6_hdr *ip6hdr = buffer;
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, TAG, "Version 6 protocol %d", ip6hdr->ip6_nxt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
__android_log_print(ANDROID_LOG_WARN, TAG, "Unknown version %d", version);
|
||||||
|
|
||||||
|
(*env)->ReleaseByteArrayElements(env, buffer_, buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short checksum(unsigned short *addr, int len) {
|
||||||
|
unsigned short result;
|
||||||
|
unsigned int sum = 0;
|
||||||
|
|
||||||
|
while (len > 1) {
|
||||||
|
sum += *addr++;
|
||||||
|
len -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len == 1)
|
||||||
|
sum += *(unsigned char *) addr;
|
||||||
|
|
||||||
|
sum = (sum >> 16) + (sum & 0xFFFF);
|
||||||
|
sum += (sum >> 16);
|
||||||
|
result = ~sum;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue