android.os.Process: add killProcessGroup

Add Process.killProcessGroup to interface between ActivityManager and
libprocessgroup.

Bug: 15313911
Change-Id: I5226a6d86153b863e30d936cf1c84e256f0d7ea5
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 86c749a..8caea25 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -1085,4 +1085,18 @@
          */
         public boolean usingWrapper;
     }
+
+    /**
+     * Kill all processes in a process group started for the given
+     * pid.
+     * @hide
+     */
+    public static final native int killProcessGroup(int uid, int pid);
+
+    /**
+     * Remove all process groups.  Expected to be called when ActivityManager
+     * is restarted.
+     * @hide
+     */
+    public static final native void removeAllProcessGroups();
 }
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 869a91b..9b96495 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -242,7 +242,8 @@
 	libnetd_client \
 	libsoundtrigger \
 	libminikin \
-	libstlport
+	libstlport \
+	libprocessgroup \
 
 ifeq ($(USE_OPENGL_RENDERER),true)
 	LOCAL_SHARED_LIBRARIES += libhwui
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index a6b65cc..aaa680f 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -24,6 +24,7 @@
 #include <cutils/sched_policy.h>
 #include <utils/String8.h>
 #include <utils/Vector.h>
+#include <processgroup/processgroup.h>
 
 #include <android_runtime/AndroidRuntime.h>
 
@@ -1002,6 +1003,16 @@
     return pidArray;
 }
 
+jint android_os_Process_killProcessGroup(JNIEnv* env, jobject clazz, jint uid, jint pid)
+{
+    return killProcessGroup(uid, pid, SIGKILL);
+}
+
+void android_os_Process_removeAllProcessGroups(JNIEnv* env, jobject clazz)
+{
+    return removeAllProcessGroups();
+}
+
 static const JNINativeMethod methods[] = {
     {"getUidForName",       "(Ljava/lang/String;)I", (void*)android_os_Process_getUidForName},
     {"getGidForName",       "(Ljava/lang/String;)I", (void*)android_os_Process_getGidForName},
@@ -1029,6 +1040,8 @@
     {"getPss", "(I)J", (void*)android_os_Process_getPss},
     {"getPidsForCommands", "([Ljava/lang/String;)[I", (void*)android_os_Process_getPidsForCommands},
     //{"setApplicationObject", "(Landroid/os/IBinder;)V", (void*)android_os_Process_setApplicationObject},
+    {"killProcessGroup", "(II)I", (void*)android_os_Process_killProcessGroup},
+    {"removeAllProcessGroups", "()V", (void*)android_os_Process_removeAllProcessGroups},
 };
 
 const char* const kProcessPathName = "android/os/Process";