diff --git a/libcore/icu/src/main/native/ErrorCode.cpp b/libcore/icu/src/main/native/ErrorCode.cpp
index 94c4239..a9d0691 100644
--- a/libcore/icu/src/main/native/ErrorCode.cpp
+++ b/libcore/icu/src/main/native/ErrorCode.cpp
@@ -34,6 +34,6 @@
     case U_UNSUPPORTED_ERROR:
         return jniThrowException(env, "java/lang/UnsupportedOperationException", message);
     default:
-        return jniThrowException(env, "java/lang/RuntimeException", message);
+        return jniThrowRuntimeException(env, message);
     }
 }
diff --git a/libcore/icu/src/main/native/NativeDecimalFormat.cpp b/libcore/icu/src/main/native/NativeDecimalFormat.cpp
index ba62726..9170f27 100644
--- a/libcore/icu/src/main/native/NativeDecimalFormat.cpp
+++ b/libcore/icu/src/main/native/NativeDecimalFormat.cpp
@@ -29,18 +29,13 @@
 #include <stdlib.h>
 #include <string.h>
 
-// FIXME: move to JNIHelp.h
-static void jniThrowNullPointerException(JNIEnv* env) {
-    jniThrowException(env, "java/lang/NullPointerException", NULL);
-}
-
 static DecimalFormat* toDecimalFormat(jint addr) {
     return reinterpret_cast<DecimalFormat*>(static_cast<uintptr_t>(addr));
 }
 
 static jint openDecimalFormatImpl(JNIEnv* env, jclass clazz, jstring pattern0) {
     if (pattern0 == NULL) {
-        jniThrowNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return 0;
     }
 
@@ -218,7 +213,7 @@
 
 static void applyPatternImpl(JNIEnv *env, jclass clazz, jint addr, jboolean localized, jstring pattern0) {
     if (pattern0 == NULL) {
-        jniThrowNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return;
     }
     ScopedJavaUnicodeString pattern(env, pattern0);
diff --git a/libcore/icu/src/main/native/NativeRegEx.cpp b/libcore/icu/src/main/native/NativeRegEx.cpp
index 387d7e4..7b3cafc 100644
--- a/libcore/icu/src/main/native/NativeRegEx.cpp
+++ b/libcore/icu/src/main/native/NativeRegEx.cpp
@@ -54,9 +54,8 @@
     env->Throw(except);
 }
 
-static void throwRuntimeException(JNIEnv* env, UErrorCode status)
-{
-    jniThrowException(env, "java/lang/RuntimeException", u_errorName(status));
+static void throwRuntimeException(JNIEnv* env, UErrorCode status) {
+    jniThrowRuntimeException(env, u_errorName(status));
 }
 
 static void _close(JNIEnv* env, jclass clazz, RegExData* data)
diff --git a/libcore/icu/src/main/native/UCharacter.cpp b/libcore/icu/src/main/native/UCharacter.cpp
index c13b6d3..3fd8151 100644
--- a/libcore/icu/src/main/native/UCharacter.cpp
+++ b/libcore/icu/src/main/native/UCharacter.cpp
@@ -138,7 +138,7 @@
 
 static int forNameImpl(JNIEnv* env, jclass, jstring blockName) {
     if (blockName == NULL) {
-        jniThrowException(env, "java/lang/NullPointerException", NULL);
+        jniThrowNullPointerException(env, NULL);
         return -1;
     }
     const char* bName = env->GetStringUTFChars(blockName, NULL);
diff --git a/libcore/luni-kernel/src/main/native/java_lang_System.cpp b/libcore/luni-kernel/src/main/native/java_lang_System.cpp
index d02481c..52150d3 100644
--- a/libcore/luni-kernel/src/main/native/java_lang_System.cpp
+++ b/libcore/luni-kernel/src/main/native/java_lang_System.cpp
@@ -38,7 +38,7 @@
         }
         env->ReleaseStringUTFChars(nameStr, name);
     } else {
-        jniThrowException(env, "java/lang/NullPointerException", NULL);
+        jniThrowNullPointerException(env, NULL);
     }
 
     return valueStr;
diff --git a/libcore/luni/src/main/native/java_net_InetAddress.cpp b/libcore/luni/src/main/native/java_net_InetAddress.cpp
index 63053a8..04c18af 100644
--- a/libcore/luni/src/main/native/java_net_InetAddress.cpp
+++ b/libcore/luni/src/main/native/java_net_InetAddress.cpp
@@ -143,8 +143,7 @@
         }
     } else if (result == EAI_SYSTEM && errno == EACCES) {
         /* No permission to use network */
-        jniThrowException(
-            env, "java/lang/SecurityException",
+        jniThrowException(env, "java/lang/SecurityException",
             "Permission denied (maybe missing INTERNET permission)");
     } else {
         jniThrowException(env, "java/net/UnknownHostException",
@@ -160,7 +159,7 @@
 
 jobjectArray InetAddress_getaddrinfo(JNIEnv* env, jobject obj, jstring javaName) {
     if (javaName == NULL) {
-        jniThrowException(env, "java/lang/NullPointerException", NULL);
+        jniThrowNullPointerException(env, NULL);
         return NULL;
     }
     const char* name = env->GetStringUTFChars(javaName, NULL);
@@ -182,7 +181,7 @@
                                          jbyteArray javaAddress)
 {
     if (javaAddress == NULL) {
-        jniThrowException(env, "java/lang/NullPointerException", NULL);
+        jniThrowNullPointerException(env, NULL);
         return NULL;
     }
 
diff --git a/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp b/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
index 07eb381..12c3dd9 100644
--- a/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
+++ b/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
@@ -227,11 +227,6 @@
     jniThrowExceptionWithErrno(env, "java/net/SocketTimeoutException", error);
 }
 
-// TODO(enh): move to JNIHelp.h
-static void throwNullPointerException(JNIEnv *env) {
-    jniThrowException(env, "java/lang/NullPointerException", NULL);
-}
-
 // Used by functions that shouldn't throw SocketException. (These functions
 // aren't meant to see bad addresses, so seeing one really does imply an
 // internal error.)
@@ -377,7 +372,7 @@
 static bool byteArrayToSocketAddress(JNIEnv *env,
         jbyteArray addressBytes, int port, sockaddr_storage *sockaddress) {
     if (addressBytes == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return false;
     }
 
@@ -412,7 +407,7 @@
         int port, sockaddr_storage *sockaddress) {
     // Get the byte array that stores the IP address bytes in the InetAddress.
     if (inetaddress == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return false;
     }
     jbyteArray addressBytes =
@@ -432,7 +427,7 @@
 static jstring osNetworkSystem_byteArrayToIpString(JNIEnv* env, jclass,
         jbyteArray byteArray) {
     if (byteArray == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return NULL;
     }
     sockaddr_storage ss;
@@ -486,7 +481,7 @@
 static jbyteArray osNetworkSystem_ipStringToByteArray(JNIEnv* env, jclass,
         jstring javaString) {
     if (javaString == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return NULL;
     }
 
@@ -1442,7 +1437,7 @@
 static int createSocketFileDescriptor(JNIEnv* env, jobject fileDescriptor,
                                       int type) {
     if (fileDescriptor == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         errno = EBADF;
         return -1;
     }
@@ -1843,7 +1838,7 @@
     // LOGD("ENTER acceptSocketImpl");
 
     if (newSocket == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return;
     }
 
diff --git a/libcore/openssl/src/main/native/BNInterface.c b/libcore/openssl/src/main/native/BNInterface.c
index 79f0680..ff2a2ae 100644
--- a/libcore/openssl/src/main/native/BNInterface.c
+++ b/libcore/openssl/src/main/native/BNInterface.c
@@ -31,20 +31,12 @@
 #define TRUE 1
 #endif
 
-
-static void
-throwNewNullPointerException (JNIEnv* env, const char* message)
-{
-    jniThrowException(env, "java/lang/NullPointerException", message);
-}
-
-static int isValidHandle (JNIEnv* env, void* handle, const char *message)
-{
+static int isValidHandle (JNIEnv* env, void* handle, const char *message) {
     if (handle == NULL) {
-        throwNewNullPointerException(env, message);
+        jniThrowNullPointerException(env, message);
         return FALSE;
     }
-    else return TRUE;
+    return TRUE;
 }
 
 static int oneValidHandle (JNIEnv* env, void* a)
diff --git a/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp b/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp
index c6d23e7..69ab7fe 100644
--- a/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp
+++ b/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp
@@ -40,20 +40,6 @@
     ERR_remove_state(0);
 }
 
-/**
- * Throws a NullPointerException without any message.
- */
-static void throwNullPointerException(JNIEnv* env) {
-    jniThrowException(env, "java/lang/NullPointerException", NULL);
-}
-
-/**
- * Throws a RuntimeException with a human-readable error message.
- */
-static void throwRuntimeException(JNIEnv* env, const char* message) {
-    jniThrowException(env, "java/lang/RuntimeException", message);
-}
-
 /*
  * Checks this thread's OpenSSL error queue and throws a RuntimeException if
  * necessary.
@@ -68,7 +54,7 @@
         char message[50];
         ERR_error_string_n(error, message, sizeof(message));
         LOGD("OpenSSL error %d: %s", error, message);
-        throwRuntimeException(env, message);
+        jniThrowRuntimeException(env, message);
         result = 1;
     }
 
@@ -105,7 +91,7 @@
     
     if (rsa->n == NULL || rsa->e == NULL) {
         rsaDestroyKey(env, clazz, rsa);
-        throwRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
+        jniThrowRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
         return NULL;
     }
     
@@ -131,7 +117,7 @@
     
     if (rsa->n == NULL || rsa->e == NULL || rsa->d == NULL || rsa->p == NULL || rsa->q == NULL) {
         rsaDestroyKey(env, clazz, rsa);
-        throwRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
+        jniThrowRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
         return NULL;
     }
     
@@ -168,7 +154,7 @@
 
     if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL || dsa->pub_key == NULL) {
         DSA_free(dsa);
-        throwRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
+        jniThrowRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
         return NULL;
     }
     
@@ -206,7 +192,7 @@
     
     if (rsa->n == NULL || rsa->e == NULL) {
         RSA_free(rsa);
-        throwRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
+        jniThrowRuntimeException(env, "Unable to convert BigInteger to BIGNUM");
         return NULL;
     }
     
@@ -254,7 +240,7 @@
     // LOGI("NativeCrypto_EVP_DigestFinal%x, %x, %d, %d", ctx, hash, offset);
     
     if (ctx == NULL || hash == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return -1;
     }
 
@@ -276,7 +262,7 @@
     // LOGI("NativeCrypto_EVP_DigestInit");
     
     if (ctx == NULL || algorithm == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return;
     }
     
@@ -286,7 +272,7 @@
     env->ReleaseStringUTFChars(algorithm, algorithmChars);
     
     if (digest == NULL) {
-        throwRuntimeException(env, "Hash algorithm not found");
+        jniThrowRuntimeException(env, "Hash algorithm not found");
         return;
     }
     
@@ -302,7 +288,7 @@
     // LOGI("NativeCrypto_EVP_DigestSize");
     
     if (ctx == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return -1;
     }
     
@@ -320,7 +306,7 @@
     // LOGI("NativeCrypto_EVP_DigestBlockSize");
     
     if (ctx == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return -1;
     }
     
@@ -338,7 +324,7 @@
     // LOGI("NativeCrypto_EVP_DigestUpdate %x, %x, %d, %d", ctx, buffer, offset, length);
     
     if (ctx == NULL || buffer == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return;
     }
   
@@ -356,7 +342,7 @@
     // LOGI("NativeCrypto_EVP_VerifyInit");
     
     if (ctx == NULL || algorithm == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return;
     }
     
@@ -366,7 +352,7 @@
     env->ReleaseStringUTFChars(algorithm, algorithmChars);
     
     if (digest == NULL) {
-        throwRuntimeException(env, "Hash algorithm not found");
+        jniThrowRuntimeException(env, "Hash algorithm not found");
         return;
     }
     
@@ -382,7 +368,7 @@
     // LOGI("NativeCrypto_EVP_VerifyUpdate %x, %x, %d, %d", ctx, buffer, offset, length);
     
     if (ctx == NULL || buffer == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return;
     }
   
@@ -400,7 +386,7 @@
     // LOGI("NativeCrypto_EVP_VerifyFinal %x, %x, %d, %d %x", ctx, buffer, offset, length, pkey);
     
     if (ctx == NULL || buffer == NULL || pkey == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return -1;
     }
   
diff --git a/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp b/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp
index 646ae97..a3c86d6 100644
--- a/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp
+++ b/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp
@@ -64,24 +64,6 @@
 }
 
 /**
- * Throws a NullPointerException without any message.
- */
-static void throwNullPointerException(JNIEnv* env) {
-    if (jniThrowException(env, "java/lang/NullPointerException", NULL)) {
-        LOGE("Unable to throw");
-    }
-}
-
-/**
- * Throws a RuntimeException with a human-readable error message.
- */
-static void throwRuntimeException(JNIEnv* env, const char* message) {
-    if (jniThrowException(env, "java/lang/RuntimeException", message)) {
-        LOGE("Unable to throw");
-    }
-}
-
-/**
  * Throws an SocketTimeoutException with the given string as a message.
  */
 static void throwSocketTimeoutException(JNIEnv* env, const char* message) {
@@ -1770,7 +1752,7 @@
     // LOGD("Entering verifysignature()");
 
     if (msg == NULL || sig == NULL || algorithm == NULL || mod == NULL || exp == NULL) {
-        throwNullPointerException(env);
+        jniThrowNullPointerException(env, NULL);
         return -1;
     }
 
@@ -1809,9 +1791,9 @@
         if (error != 0) {
             char message[50];
             ERR_error_string_n(error, message, sizeof(message));
-            throwRuntimeException(env, message);
+            jniThrowRuntimeException(env, message);
         } else {
-            throwRuntimeException(env, "Internal error during verification");
+            jniThrowRuntimeException(env, "Internal error during verification");
         }
         freeSslErrorState();
     }
diff --git a/libnativehelper/JNIHelp.c b/libnativehelper/JNIHelp.c
index d0e2f89..a75b837 100644
--- a/libnativehelper/JNIHelp.c
+++ b/libnativehelper/JNIHelp.c
@@ -133,6 +133,14 @@
 }
 
 /*
+ * Throw a java.lang.NullPointerException, with an optional message.
+ */
+int jniThrowNullPointerException(JNIEnv* env, const char* msg)
+{
+    return jniThrowException(env, "java/lang/NullPointerException", msg);
+}
+
+/*
  * Throw a java.lang.RuntimeException, with an optional message.
  */
 int jniThrowRuntimeException(JNIEnv* env, const char* msg)
diff --git a/libnativehelper/include/nativehelper/JNIHelp.h b/libnativehelper/include/nativehelper/JNIHelp.h
index 3d8983f..59c2620 100644
--- a/libnativehelper/include/nativehelper/JNIHelp.h
+++ b/libnativehelper/include/nativehelper/JNIHelp.h
@@ -54,9 +54,14 @@
 int jniThrowException(C_JNIEnv* env, const char* className, const char* msg);
 
 /*
+ * Throw a java.lang.NullPointerException, with an optional message.
+ */
+int jniThrowNullPointerException(C_JNIEnv* env, const char* msg);
+
+/*
  * Throw a java.lang.RuntimeException, with an optional message.
  */
-int jniThrowRuntimeException(JNIEnv* env, const char* msg);
+int jniThrowRuntimeException(C_JNIEnv* env, const char* msg);
 
 /*
  * Throw a java.io.IOException, generating the message from errno.
@@ -107,6 +112,14 @@
 {
     return jniThrowException(&env->functions, className, msg);
 }
+inline int jniThrowNullPointerException(JNIEnv* env, const char* msg)
+{
+    return jniThrowNullPointerException(&env->functions, msg);
+}
+inline int jniThrowRuntimeException(JNIEnv* env, const char* msg)
+{
+    return jniThrowRuntimeException(&env->functions, msg);
+}
 inline int jniThrowIOException(JNIEnv* env, int errnum)
 {
     return jniThrowIOException(&env->functions, errnum);
