The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2008, The Android Open Source Project |
| 3 | * |
Elliott Hughes | dd66bcb | 2011-04-12 11:28:59 -0700 | [diff] [blame] | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 7 | * |
Elliott Hughes | dd66bcb | 2011-04-12 11:28:59 -0700 | [diff] [blame] | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 9 | * |
Elliott Hughes | dd66bcb | 2011-04-12 11:28:59 -0700 | [diff] [blame] | 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #define LOG_TAG "NetUtils" |
| 18 | |
| 19 | #include "jni.h" |
| 20 | #include <utils/misc.h> |
| 21 | #include <android_runtime/AndroidRuntime.h> |
| 22 | #include <utils/Log.h> |
| 23 | #include <arpa/inet.h> |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 24 | #include <cutils/properties.h> |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 25 | |
| 26 | extern "C" { |
Mike Lockwood | 0900f36 | 2009-07-10 17:24:07 -0400 | [diff] [blame] | 27 | int ifc_enable(const char *ifname); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 28 | int ifc_disable(const char *ifname); |
Wink Saville | 8171e6f | 2011-07-07 16:17:06 -0700 | [diff] [blame] | 29 | int ifc_reset_connections(const char *ifname, int reset_mask); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 30 | |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 31 | int dhcp_do_request(const char * const ifname, |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 32 | const char *ipaddr, |
| 33 | const char *gateway, |
Jeff Sharkey | 77b87ba | 2012-04-18 21:55:14 -0700 | [diff] [blame] | 34 | uint32_t *prefixLength, |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 35 | const char *dns[], |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 36 | const char *server, |
Jeff Sharkey | 77b87ba | 2012-04-18 21:55:14 -0700 | [diff] [blame] | 37 | uint32_t *lease, |
Robert Greenwalt | 8058f62 | 2012-11-09 10:52:27 -0800 | [diff] [blame] | 38 | const char *vendorInfo, |
| 39 | const char *domains); |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 40 | |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 41 | int dhcp_do_request_renew(const char * const ifname, |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 42 | const char *ipaddr, |
| 43 | const char *gateway, |
Jeff Sharkey | 77b87ba | 2012-04-18 21:55:14 -0700 | [diff] [blame] | 44 | uint32_t *prefixLength, |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 45 | const char *dns[], |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 46 | const char *server, |
Jeff Sharkey | 77b87ba | 2012-04-18 21:55:14 -0700 | [diff] [blame] | 47 | uint32_t *lease, |
Robert Greenwalt | 8058f62 | 2012-11-09 10:52:27 -0800 | [diff] [blame] | 48 | const char *vendorInfo, |
| 49 | const char *domains); |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 50 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 51 | int dhcp_stop(const char *ifname); |
| 52 | int dhcp_release_lease(const char *ifname); |
| 53 | char *dhcp_get_errmsg(); |
| 54 | } |
| 55 | |
| 56 | #define NETUTILS_PKG_NAME "android/net/NetworkUtils" |
| 57 | |
| 58 | namespace android { |
| 59 | |
| 60 | /* |
| 61 | * The following remembers the jfieldID's of the fields |
| 62 | * of the DhcpInfo Java object, so that we don't have |
| 63 | * to look them up every time. |
| 64 | */ |
| 65 | static struct fieldIds { |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 66 | jmethodID clear; |
| 67 | jmethodID setInterfaceName; |
| 68 | jmethodID addLinkAddress; |
| 69 | jmethodID addGateway; |
| 70 | jmethodID addDns; |
Robert Greenwalt | 8058f62 | 2012-11-09 10:52:27 -0800 | [diff] [blame] | 71 | jmethodID setDomains; |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 72 | jmethodID setServerAddress; |
| 73 | jmethodID setLeaseDuration; |
| 74 | jmethodID setVendorInfo; |
| 75 | } dhcpResultsFieldIds; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 76 | |
Mike Lockwood | 0900f36 | 2009-07-10 17:24:07 -0400 | [diff] [blame] | 77 | static jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) |
| 78 | { |
| 79 | int result; |
| 80 | |
| 81 | const char *nameStr = env->GetStringUTFChars(ifname, NULL); |
| 82 | result = ::ifc_enable(nameStr); |
| 83 | env->ReleaseStringUTFChars(ifname, nameStr); |
| 84 | return (jint)result; |
| 85 | } |
| 86 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 87 | static jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) |
| 88 | { |
| 89 | int result; |
| 90 | |
| 91 | const char *nameStr = env->GetStringUTFChars(ifname, NULL); |
| 92 | result = ::ifc_disable(nameStr); |
| 93 | env->ReleaseStringUTFChars(ifname, nameStr); |
| 94 | return (jint)result; |
| 95 | } |
| 96 | |
Wink Saville | 8171e6f | 2011-07-07 16:17:06 -0700 | [diff] [blame] | 97 | static jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, |
| 98 | jstring ifname, jint mask) |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 99 | { |
| 100 | int result; |
| 101 | |
| 102 | const char *nameStr = env->GetStringUTFChars(ifname, NULL); |
Wink Saville | 8171e6f | 2011-07-07 16:17:06 -0700 | [diff] [blame] | 103 | |
Steve Block | 5baa3a6 | 2011-12-20 16:23:08 +0000 | [diff] [blame] | 104 | ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", |
Wink Saville | 8171e6f | 2011-07-07 16:17:06 -0700 | [diff] [blame] | 105 | env, clazz, nameStr, mask); |
| 106 | |
| 107 | result = ::ifc_reset_connections(nameStr, mask); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 108 | env->ReleaseStringUTFChars(ifname, nameStr); |
| 109 | return (jint)result; |
| 110 | } |
| 111 | |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 112 | static jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 113 | jobject dhcpResults, bool renew) |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 114 | { |
| 115 | int result; |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 116 | char ipaddr[PROPERTY_VALUE_MAX]; |
| 117 | uint32_t prefixLength; |
| 118 | char gateway[PROPERTY_VALUE_MAX]; |
| 119 | char dns1[PROPERTY_VALUE_MAX]; |
| 120 | char dns2[PROPERTY_VALUE_MAX]; |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 121 | char dns3[PROPERTY_VALUE_MAX]; |
| 122 | char dns4[PROPERTY_VALUE_MAX]; |
| 123 | const char *dns[5] = {dns1, dns2, dns3, dns4, NULL}; |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 124 | char server[PROPERTY_VALUE_MAX]; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 125 | uint32_t lease; |
Jeff Sharkey | 77b87ba | 2012-04-18 21:55:14 -0700 | [diff] [blame] | 126 | char vendorInfo[PROPERTY_VALUE_MAX]; |
Robert Greenwalt | 8058f62 | 2012-11-09 10:52:27 -0800 | [diff] [blame] | 127 | char domains[PROPERTY_VALUE_MAX]; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 128 | |
| 129 | const char *nameStr = env->GetStringUTFChars(ifname, NULL); |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 130 | if (nameStr == NULL) return (jboolean)false; |
| 131 | |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 132 | if (renew) { |
| 133 | result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 134 | dns, server, &lease, vendorInfo, domains); |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 135 | } else { |
| 136 | result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 137 | dns, server, &lease, vendorInfo, domains); |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 138 | } |
Robert Greenwalt | 28cdf1d | 2013-03-15 10:48:46 -0700 | [diff] [blame] | 139 | if (result != 0) { |
| 140 | ALOGD("dhcp_do_request failed"); |
| 141 | } |
| 142 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 143 | env->ReleaseStringUTFChars(ifname, nameStr); |
Brian Carlstrom | 46e18c11 | 2011-04-05 22:44:45 -0700 | [diff] [blame] | 144 | if (result == 0) { |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 145 | env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear); |
Robert Greenwalt | aa70f10 | 2011-04-28 14:28:50 -0700 | [diff] [blame] | 146 | |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 147 | // set mIfaceName |
| 148 | // dhcpResults->setInterfaceName(ifname) |
| 149 | env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setInterfaceName, ifname); |
| 150 | |
| 151 | // set the linkAddress |
| 152 | // dhcpResults->addLinkAddress(inetAddress, prefixLength) |
| 153 | result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addLinkAddress, |
| 154 | env->NewStringUTF(ipaddr), prefixLength); |
| 155 | } |
| 156 | |
| 157 | if (result == 0) { |
Robert Greenwalt | aa70f10 | 2011-04-28 14:28:50 -0700 | [diff] [blame] | 158 | // set the gateway |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 159 | // dhcpResults->addGateway(gateway) |
| 160 | result = env->CallBooleanMethod(dhcpResults, |
| 161 | dhcpResultsFieldIds.addGateway, env->NewStringUTF(gateway)); |
| 162 | } |
Robert Greenwalt | aa70f10 | 2011-04-28 14:28:50 -0700 | [diff] [blame] | 163 | |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 164 | if (result == 0) { |
| 165 | // dhcpResults->addDns(new InetAddress(dns1)) |
| 166 | result = env->CallBooleanMethod(dhcpResults, |
| 167 | dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1)); |
| 168 | } |
Robert Greenwalt | aa70f10 | 2011-04-28 14:28:50 -0700 | [diff] [blame] | 169 | |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 170 | if (result == 0) { |
Robert Greenwalt | 8058f62 | 2012-11-09 10:52:27 -0800 | [diff] [blame] | 171 | env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains, |
| 172 | env->NewStringUTF(domains)); |
| 173 | |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 174 | result = env->CallBooleanMethod(dhcpResults, |
| 175 | dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2)); |
Robert Greenwalt | 3c97f94 | 2013-01-09 16:28:19 -0800 | [diff] [blame] | 176 | |
| 177 | if (result == 0) { |
| 178 | result = env->CallBooleanMethod(dhcpResults, |
| 179 | dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3)); |
| 180 | if (result == 0) { |
| 181 | result = env->CallBooleanMethod(dhcpResults, |
| 182 | dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4)); |
| 183 | } |
| 184 | } |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 185 | } |
Robert Greenwalt | aa70f10 | 2011-04-28 14:28:50 -0700 | [diff] [blame] | 186 | |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 187 | if (result == 0) { |
| 188 | // dhcpResults->setServerAddress(new InetAddress(server)) |
| 189 | result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress, |
Robert Greenwalt | 0216e61 | 2011-01-14 16:29:58 -0800 | [diff] [blame] | 190 | env->NewStringUTF(server)); |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 191 | } |
| 192 | |
| 193 | if (result == 0) { |
| 194 | // dhcpResults->setLeaseDuration(lease) |
| 195 | env->CallVoidMethod(dhcpResults, |
| 196 | dhcpResultsFieldIds.setLeaseDuration, lease); |
| 197 | |
| 198 | // dhcpResults->setVendorInfo(vendorInfo) |
| 199 | env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo, |
| 200 | env->NewStringUTF(vendorInfo)); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 201 | } |
| 202 | return (jboolean)(result == 0); |
| 203 | } |
| 204 | |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 205 | |
Irfan Sheriff | 31be7cf | 2011-04-28 10:25:31 -0700 | [diff] [blame] | 206 | static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) |
| 207 | { |
| 208 | return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); |
| 209 | } |
| 210 | |
| 211 | static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) |
| 212 | { |
| 213 | return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); |
| 214 | } |
| 215 | |
| 216 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 217 | static jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) |
| 218 | { |
| 219 | int result; |
| 220 | |
| 221 | const char *nameStr = env->GetStringUTFChars(ifname, NULL); |
| 222 | result = ::dhcp_stop(nameStr); |
| 223 | env->ReleaseStringUTFChars(ifname, nameStr); |
| 224 | return (jboolean)(result == 0); |
| 225 | } |
| 226 | |
| 227 | static jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) |
| 228 | { |
| 229 | int result; |
| 230 | |
| 231 | const char *nameStr = env->GetStringUTFChars(ifname, NULL); |
| 232 | result = ::dhcp_release_lease(nameStr); |
| 233 | env->ReleaseStringUTFChars(ifname, nameStr); |
| 234 | return (jboolean)(result == 0); |
| 235 | } |
| 236 | |
| 237 | static jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) |
| 238 | { |
| 239 | return env->NewStringUTF(::dhcp_get_errmsg()); |
| 240 | } |
| 241 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 242 | // ---------------------------------------------------------------------------- |
| 243 | |
| 244 | /* |
| 245 | * JNI registration. |
| 246 | */ |
| 247 | static JNINativeMethod gNetworkUtilMethods[] = { |
| 248 | /* name, signature, funcPtr */ |
| 249 | |
Mike Lockwood | 0900f36 | 2009-07-10 17:24:07 -0400 | [diff] [blame] | 250 | { "enableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_enableInterface }, |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 251 | { "disableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_disableInterface }, |
Wink Saville | 8171e6f | 2011-07-07 16:17:06 -0700 | [diff] [blame] | 252 | { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 253 | { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcp }, |
| 254 | { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcpRenew }, |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 255 | { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, |
| 256 | { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 257 | { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, |
| 258 | }; |
| 259 | |
| 260 | int register_android_net_NetworkUtils(JNIEnv* env) |
| 261 | { |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 262 | jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults"); |
| 263 | LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults"); |
| 264 | dhcpResultsFieldIds.clear = |
| 265 | env->GetMethodID(dhcpResultsClass, "clear", "()V"); |
| 266 | dhcpResultsFieldIds.setInterfaceName = |
| 267 | env->GetMethodID(dhcpResultsClass, "setInterfaceName", "(Ljava/lang/String;)V"); |
| 268 | dhcpResultsFieldIds.addLinkAddress = |
| 269 | env->GetMethodID(dhcpResultsClass, "addLinkAddress", "(Ljava/lang/String;I)Z"); |
| 270 | dhcpResultsFieldIds.addGateway = |
| 271 | env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z"); |
| 272 | dhcpResultsFieldIds.addDns = |
| 273 | env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z"); |
Robert Greenwalt | 8058f62 | 2012-11-09 10:52:27 -0800 | [diff] [blame] | 274 | dhcpResultsFieldIds.setDomains = |
| 275 | env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V"); |
Robert Greenwalt | 4717c26 | 2012-10-31 14:32:53 -0700 | [diff] [blame] | 276 | dhcpResultsFieldIds.setServerAddress = |
| 277 | env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z"); |
| 278 | dhcpResultsFieldIds.setLeaseDuration = |
| 279 | env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V"); |
| 280 | dhcpResultsFieldIds.setVendorInfo = |
| 281 | env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V"); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 282 | |
| 283 | return AndroidRuntime::registerNativeMethods(env, |
| 284 | NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); |
| 285 | } |
| 286 | |
| 287 | }; // namespace android |