service-t/jni/com_android_server_net_NetworkStats{Factory,Service}: improve jni

Note that we no longer need the (void*) casts, this is because:
  MAKE_JNI_NATIVE_METHOD() checks function args match
  MAKE_JNI_NATIVE_METHOD_AUTOSIG() autogenerates the signature

Additionally:
  nativeGetTotalStat()
  nativeGetIfaceStat()
  nativeGetUidStat()
should be faster now, by virtue of caching a bunch of calls.

This more-or-less mirrors what was already done in the other file.

Test: TreeHugger
Flag: EXEMPT mainline
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I5a715d15ca5c01b625b8b7a62bc0e10bc0cc213f
diff --git a/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp b/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp
index a16757b..5edd0f6 100644
--- a/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp
+++ b/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp
@@ -24,6 +24,7 @@
 
 #include <jni.h>
 
+#include <nativehelper/jni_macros.h>
 #include <nativehelper/JNIHelp.h>
 #include <nativehelper/ScopedUtfChars.h>
 #include <nativehelper/ScopedLocalRef.h>
@@ -64,9 +65,7 @@
 {
     if (!grow) {
         jobjectArray array = (jobjectArray)env->GetObjectField(obj, field);
-        if (array != NULL) {
-            return array;
-        }
+        if (array) return array;
     }
     return env->NewObjectArray(size, gStringClass, NULL);
 }
@@ -75,9 +74,7 @@
 {
     if (!grow) {
         jintArray array = (jintArray)env->GetObjectField(obj, field);
-        if (array != NULL) {
-            return array;
-        }
+        if (array) return array;
     }
     return env->NewIntArray(size);
 }
@@ -86,9 +83,7 @@
 {
     if (!grow) {
         jlongArray array = (jlongArray)env->GetObjectField(obj, field);
-        if (array != NULL) {
-            return array;
-        }
+        if (array) return array;
     }
     return env->NewLongArray(size);
 }
@@ -101,40 +96,51 @@
 
     ScopedLocalRef<jobjectArray> iface(env, get_string_array(env, stats,
             gNetworkStatsClassInfo.iface, size, grow));
-    if (iface.get() == NULL) return -1;
+    if (!iface.get()) return -1;
+
     ScopedIntArrayRW uid(env, get_int_array(env, stats,
             gNetworkStatsClassInfo.uid, size, grow));
-    if (uid.get() == NULL) return -1;
+    if (!uid.get()) return -1;
+
     ScopedIntArrayRW set(env, get_int_array(env, stats,
             gNetworkStatsClassInfo.set, size, grow));
-    if (set.get() == NULL) return -1;
+    if (!set.get()) return -1;
+
     ScopedIntArrayRW tag(env, get_int_array(env, stats,
             gNetworkStatsClassInfo.tag, size, grow));
-    if (tag.get() == NULL) return -1;
+    if (!tag.get()) return -1;
+
     ScopedIntArrayRW metered(env, get_int_array(env, stats,
             gNetworkStatsClassInfo.metered, size, grow));
-    if (metered.get() == NULL) return -1;
+    if (!metered.get()) return -1;
+
     ScopedIntArrayRW roaming(env, get_int_array(env, stats,
             gNetworkStatsClassInfo.roaming, size, grow));
-    if (roaming.get() == NULL) return -1;
+    if (!roaming.get()) return -1;
+
     ScopedIntArrayRW defaultNetwork(env, get_int_array(env, stats,
             gNetworkStatsClassInfo.defaultNetwork, size, grow));
-    if (defaultNetwork.get() == NULL) return -1;
+    if (!defaultNetwork.get()) return -1;
+
     ScopedLongArrayRW rxBytes(env, get_long_array(env, stats,
             gNetworkStatsClassInfo.rxBytes, size, grow));
-    if (rxBytes.get() == NULL) return -1;
+    if (!rxBytes.get()) return -1;
+
     ScopedLongArrayRW rxPackets(env, get_long_array(env, stats,
             gNetworkStatsClassInfo.rxPackets, size, grow));
-    if (rxPackets.get() == NULL) return -1;
+    if (!rxPackets.get()) return -1;
+
     ScopedLongArrayRW txBytes(env, get_long_array(env, stats,
             gNetworkStatsClassInfo.txBytes, size, grow));
-    if (txBytes.get() == NULL) return -1;
+    if (!txBytes.get()) return -1;
+
     ScopedLongArrayRW txPackets(env, get_long_array(env, stats,
             gNetworkStatsClassInfo.txPackets, size, grow));
-    if (txPackets.get() == NULL) return -1;
+    if (!txPackets.get()) return -1;
+
     ScopedLongArrayRW operations(env, get_long_array(env, stats,
             gNetworkStatsClassInfo.operations, size, grow));
-    if (operations.get() == NULL) return -1;
+    if (!operations.get()) return -1;
 
     for (int i = 0; i < size; i++) {
         ScopedLocalRef<jstring> ifaceString(env, env->NewStringUTF(lines[i].iface));
@@ -173,8 +179,7 @@
 static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats) {
     std::vector<stats_line> lines;
 
-    if (parseBpfNetworkStatsDetail(&lines) < 0)
-        return -1;
+    if (parseBpfNetworkStatsDetail(&lines) < 0) return -1;
 
     return statsLinesToNetworkStats(env, clazz, stats, lines);
 }
@@ -182,25 +187,26 @@
 static int readNetworkStatsDev(JNIEnv* env, jclass clazz, jobject stats) {
     std::vector<stats_line> lines;
 
-    if (parseBpfNetworkStatsDev(&lines) < 0)
-            return -1;
+    if (parseBpfNetworkStatsDev(&lines) < 0) return -1;
 
     return statsLinesToNetworkStats(env, clazz, stats, lines);
 }
 
 static const JNINativeMethod gMethods[] = {
-        { "nativeReadNetworkStatsDetail", "(Landroid/net/NetworkStats;)I",
-                (void*) readNetworkStatsDetail },
-        { "nativeReadNetworkStatsDev", "(Landroid/net/NetworkStats;)I",
-                (void*) readNetworkStatsDev },
+    MAKE_JNI_NATIVE_METHOD("nativeReadNetworkStatsDetail", "(Landroid/net/NetworkStats;)I", readNetworkStatsDetail),
+    MAKE_JNI_NATIVE_METHOD("nativeReadNetworkStatsDev", "(Landroid/net/NetworkStats;)I", readNetworkStatsDev),
 };
 
 int register_android_server_net_NetworkStatsFactory(JNIEnv* env) {
-    int err = jniRegisterNativeMethods(env,
-            "android/net/connectivity/com/android/server/net/NetworkStatsFactory", gMethods,
-            NELEM(gMethods));
+    if (jniRegisterNativeMethods(env,
+        "android/net/connectivity/com/android/server/net/NetworkStatsFactory",
+        gMethods,
+        NELEM(gMethods))) abort();
+
     gStringClass = env->FindClass("java/lang/String");
+    if (!gStringClass) abort();
     gStringClass = static_cast<jclass>(env->NewGlobalRef(gStringClass));
+    if (!gStringClass) abort();
 
     jclass clazz = env->FindClass("android/net/NetworkStats");
     gNetworkStatsClassInfo.size = env->GetFieldID(clazz, "size", "I");
@@ -218,7 +224,7 @@
     gNetworkStatsClassInfo.txPackets = env->GetFieldID(clazz, "txPackets", "[J");
     gNetworkStatsClassInfo.operations = env->GetFieldID(clazz, "operations", "[J");
 
-    return err;
+    return 0;
 }
 
 }
diff --git a/service-t/jni/com_android_server_net_NetworkStatsService.cpp b/service-t/jni/com_android_server_net_NetworkStatsService.cpp
index c999398..a724f3f 100644
--- a/service-t/jni/com_android_server_net_NetworkStatsService.cpp
+++ b/service-t/jni/com_android_server_net_NetworkStatsService.cpp
@@ -22,6 +22,7 @@
 #include <fcntl.h>
 #include <inttypes.h>
 #include <jni.h>
+#include <nativehelper/jni_macros.h>
 #include <nativehelper/ScopedUtfChars.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -39,73 +40,54 @@
 
 namespace android {
 
+static struct {
+    jclass theClass;
+    jmethodID constructor;
+    jfieldID rxBytes;
+    jfieldID txBytes;
+    jfieldID rxPackets;
+    jfieldID txPackets;
+} gNetworkStatsEntry;
+
 static void nativeRegisterIface(JNIEnv* env, jclass clazz, jstring iface) {
     ScopedUtfChars iface8(env, iface);
-    if (iface8.c_str() == nullptr) return;
+    if (!iface8.c_str()) return;
     bpfRegisterIface(iface8.c_str());
 }
 
 static jobject statsValueToEntry(JNIEnv* env, StatsValue* stats) {
-    // Find the Java class that represents the structure
-    jclass gEntryClass = env->FindClass("android/net/NetworkStats$Entry");
-    if (gEntryClass == nullptr) {
-        return nullptr;
-    }
-
-    // Find the constructor.
-    jmethodID constructorID = env->GetMethodID(gEntryClass, "<init>", "()V");
-    if (constructorID == nullptr) {
-        return nullptr;
-    }
-
     // Create a new instance of the Java class
-    jobject result = env->NewObject(gEntryClass, constructorID);
-    if (result == nullptr) {
-        return nullptr;
-    }
+    jobject result = env->NewObject(gNetworkStatsEntry.theClass, gNetworkStatsEntry.constructor);
+    if (!result) return nullptr;
 
     // Set the values of the structure fields in the Java object
-    env->SetLongField(result, env->GetFieldID(gEntryClass, "rxBytes", "J"), stats->rxBytes);
-    env->SetLongField(result, env->GetFieldID(gEntryClass, "txBytes", "J"), stats->txBytes);
-    env->SetLongField(result, env->GetFieldID(gEntryClass, "rxPackets", "J"), stats->rxPackets);
-    env->SetLongField(result, env->GetFieldID(gEntryClass, "txPackets", "J"), stats->txPackets);
+    env->SetLongField(result, gNetworkStatsEntry.rxBytes, stats->rxBytes);
+    env->SetLongField(result, gNetworkStatsEntry.txBytes, stats->txBytes);
+    env->SetLongField(result, gNetworkStatsEntry.rxPackets, stats->rxPackets);
+    env->SetLongField(result, gNetworkStatsEntry.txPackets, stats->txPackets);
 
     return result;
 }
 
 static jobject nativeGetTotalStat(JNIEnv* env, jclass clazz) {
     StatsValue stats = {};
-
-    if (bpfGetIfaceStats(nullptr, &stats) == 0) {
-        return statsValueToEntry(env, &stats);
-    } else {
-        return nullptr;
-    }
+    if (bpfGetIfaceStats(nullptr, &stats)) return nullptr;
+    return statsValueToEntry(env, &stats);
 }
 
 static jobject nativeGetIfaceStat(JNIEnv* env, jclass clazz, jstring iface) {
     ScopedUtfChars iface8(env, iface);
-    if (iface8.c_str() == nullptr) {
-        return nullptr;
-    }
+    if (!iface8.c_str()) return nullptr;
 
     StatsValue stats = {};
-
-    if (bpfGetIfaceStats(iface8.c_str(), &stats) == 0) {
-        return statsValueToEntry(env, &stats);
-    } else {
-        return nullptr;
-    }
+    if (bpfGetIfaceStats(iface8.c_str(), &stats)) return nullptr;
+    return statsValueToEntry(env, &stats);
 }
 
 static jobject nativeGetUidStat(JNIEnv* env, jclass clazz, jint uid) {
     StatsValue stats = {};
-
-    if (bpfGetUidStats(uid, &stats) == 0) {
-        return statsValueToEntry(env, &stats);
-    } else {
-        return nullptr;
-    }
+    if (bpfGetUidStats(uid, &stats)) return nullptr;
+    return statsValueToEntry(env, &stats);
 }
 
 static void nativeInitNetworkTracing(JNIEnv* env, jclass clazz) {
@@ -113,37 +95,44 @@
 }
 
 static const JNINativeMethod gMethods[] = {
-        {
-            "nativeRegisterIface",
-            "(Ljava/lang/String;)V",
-            (void*)nativeRegisterIface
-        },
-        {
-            "nativeGetTotalStat",
-            "()Landroid/net/NetworkStats$Entry;",
-            (void*)nativeGetTotalStat
-        },
-        {
-            "nativeGetIfaceStat",
-            "(Ljava/lang/String;)Landroid/net/NetworkStats$Entry;",
-            (void*)nativeGetIfaceStat
-        },
-        {
-            "nativeGetUidStat",
-            "(I)Landroid/net/NetworkStats$Entry;",
-            (void*)nativeGetUidStat
-        },
-        {
-            "nativeInitNetworkTracing",
-            "()V",
-            (void*)nativeInitNetworkTracing
-        },
+    MAKE_JNI_NATIVE_METHOD_AUTOSIG("nativeRegisterIface", nativeRegisterIface),
+    MAKE_JNI_NATIVE_METHOD("nativeGetTotalStat", "()Landroid/net/NetworkStats$Entry;", nativeGetTotalStat),
+    MAKE_JNI_NATIVE_METHOD("nativeGetIfaceStat", "(Ljava/lang/String;)Landroid/net/NetworkStats$Entry;", nativeGetIfaceStat),
+    MAKE_JNI_NATIVE_METHOD("nativeGetUidStat", "(I)Landroid/net/NetworkStats$Entry;", nativeGetUidStat),
+    MAKE_JNI_NATIVE_METHOD_AUTOSIG("nativeInitNetworkTracing", nativeInitNetworkTracing),
 };
 
 int register_android_server_net_NetworkStatsService(JNIEnv* env) {
-    return jniRegisterNativeMethods(env,
-            "android/net/connectivity/com/android/server/net/NetworkStatsService", gMethods,
-            NELEM(gMethods));
+    if (jniRegisterNativeMethods(env,
+        "android/net/connectivity/com/android/server/net/NetworkStatsService",
+        gMethods,
+        NELEM(gMethods))) abort();
+
+    // Find the Java class that represents the structure
+    jclass clazz = env->FindClass("android/net/NetworkStats$Entry");
+    if (!clazz) abort();
+    clazz = static_cast<jclass>(env->NewGlobalRef(clazz));
+    if (!clazz) abort();
+    gNetworkStatsEntry.theClass = clazz;
+
+    // Find the constructor.
+    gNetworkStatsEntry.constructor = env->GetMethodID(clazz, "<init>", "()V");
+    if (!gNetworkStatsEntry.constructor) abort();
+
+    // and the individual fields...
+    gNetworkStatsEntry.rxBytes = env->GetFieldID(clazz, "rxBytes", "J");
+    if (!gNetworkStatsEntry.rxBytes) abort();
+
+    gNetworkStatsEntry.txBytes = env->GetFieldID(clazz, "txBytes", "J");
+    if (!gNetworkStatsEntry.txBytes) abort();
+
+    gNetworkStatsEntry.rxPackets = env->GetFieldID(clazz, "rxPackets", "J");
+    if (!gNetworkStatsEntry.rxPackets) abort();
+
+    gNetworkStatsEntry.txPackets = env->GetFieldID(clazz, "txPackets", "J");
+    if (!gNetworkStatsEntry.txPackets) abort();
+
+    return 0;
 }
 
 }