com_android_server_location_GpsLocationProvider.cpp revision 3762c311729fe9f3af085c14c5c1fb471d994c03
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "GpsLocationProvider" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19b8d9033d9928209e68518c4b12fea74187ddb382Mike Lockwood#define LOG_NDEBUG 0 2022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 23b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood#include "hardware/hardware.h" 24b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood#include "hardware/gps.h" 258f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#include "hardware_legacy/power.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/misc.h" 28f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood#include "android_runtime/AndroidRuntime.h" 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jobject mCallbacksObj = NULL; 34f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportLocation; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportStatus; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportSvStatus; 38e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic jmethodID method_reportAGpsStatus; 39b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic jmethodID method_reportNmea; 4004598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jmethodID method_setEngineCapabilities; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_xtraDownloadRequest; 4222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jmethodID method_reportNiNotification; 431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestRefLocation; 441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestSetID; 459b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwoodstatic jmethodID method_requestUtcTime; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsInterface* sGpsInterface = NULL; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsXtraInterface* sGpsXtraInterface = NULL; 49e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic const AGpsInterface* sAGpsInterface = NULL; 5022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic const GpsNiInterface* sGpsNiInterface = NULL; 513c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic const GpsDebugInterface* sGpsDebugInterface = NULL; 521e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic const AGpsRilInterface* sAGpsRilInterface = NULL; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood// temporary storage for GPS callbacks 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GpsSvStatus sGpsSvStatus; 56f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic const char* sNmeaString; 57f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic int sNmeaStringLength; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 598f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#define WAKE_LOCK_NAME "GPS" 608f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 64f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (env->ExceptionCheck()) { 653762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 66f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGE_EX(env); 67f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ExceptionClear(); 68f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 69f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 70f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void location_callback(GpsLocation* location) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 73f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 74f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportLocation, location->flags, 75f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->latitude, (jdouble)location->longitude, 76f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->altitude, 77f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->speed, (jfloat)location->bearing, 78f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->accuracy, (jlong)location->timestamp); 79f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void status_callback(GpsStatus* status) 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 84f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 85f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportStatus, status->status); 86f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void sv_status_callback(GpsSvStatus* sv_status) 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 91f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 92f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(&sGpsSvStatus, sv_status, sizeof(sGpsSvStatus)); 93f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportSvStatus); 94f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 97b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic void nmea_callback(GpsUtcTime timestamp, const char* nmea, int length) 98b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 99f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 100f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // The Java code will call back to read these values 101f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // We do this to avoid creating unnecessary String objects 102f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaString = nmea; 103f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaStringLength = length; 104f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp); 105f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 106b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 107b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 10804598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic void set_capabilities_callback(uint32_t capabilities) 10904598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 1105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("set_capabilities_callback: %ld\n", capabilities); 111f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 112f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_setEngineCapabilities, capabilities); 113f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 11404598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 11504598b67a58fad93e5060bb77756ba4863013aedMike Lockwood 1168f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void acquire_wakelock_callback() 1178f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1188f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME); 1198f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1208f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1218f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void release_wakelock_callback() 1228f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1238f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wake_lock(WAKE_LOCK_NAME); 1248f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1258f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1269b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwoodstatic void request_utc_time_callback() 1279b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood{ 1289b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1299b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_requestUtcTime); 1309b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1319b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood} 1329b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood 133f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg) 13458bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 135f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood return (pthread_t)AndroidRuntime::createJavaThread(name, start, arg); 13658bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 13758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsCallbacks sGpsCallbacks = { 1398f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood sizeof(GpsCallbacks), 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location_callback, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_callback, 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sv_status_callback, 1438f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood nmea_callback, 14404598b67a58fad93e5060bb77756ba4863013aedMike Lockwood set_capabilities_callback, 1458f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wakelock_callback, 1468f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wakelock_callback, 147f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1489b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood request_utc_time_callback, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 151f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void xtra_download_request_callback() 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 153f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 154f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest); 155f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 15622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 15722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsXtraCallbacks sGpsXtraCallbacks = { 159f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood xtra_download_request_callback, 160f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 163f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void agps_status_callback(AGpsStatus* agps_status) 164f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 165f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1668efd74dbedb65f69734318d9d6be70767f30b57aStephen Li 1678efd74dbedb65f69734318d9d6be70767f30b57aStephen Li uint32_t ipaddr; 1688efd74dbedb65f69734318d9d6be70767f30b57aStephen Li // ipaddr field was not included in original AGpsStatus 1698efd74dbedb65f69734318d9d6be70767f30b57aStephen Li if (agps_status->size >= sizeof(AGpsStatus)) 1708efd74dbedb65f69734318d9d6be70767f30b57aStephen Li ipaddr = agps_status->ipaddr; 1718efd74dbedb65f69734318d9d6be70767f30b57aStephen Li else 1728efd74dbedb65f69734318d9d6be70767f30b57aStephen Li ipaddr = 0xFFFFFFFF; 173f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, 1748efd74dbedb65f69734318d9d6be70767f30b57aStephen Li agps_status->type, agps_status->status, ipaddr); 175f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 176f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 177f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 178e3635c9693c4cd9650684f14e19dcabcea0d488aMike LockwoodAGpsCallbacks sAGpsCallbacks = { 179e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood agps_status_callback, 180f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 18158bda987665af759c379cd494ff4873ac61acf29Mike Lockwood}; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 183f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void gps_ni_notify_callback(GpsNiNotification *notification) 184f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 1855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("gps_ni_notify_callback\n"); 186f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 187f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring requestor_id = env->NewStringUTF(notification->requestor_id); 188f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring text = env->NewStringUTF(notification->text); 189f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring extras = env->NewStringUTF(notification->extras); 190f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 191f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id && text && extras) { 192f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNiNotification, 193f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notification_id, notification->ni_type, 194f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notify_flags, notification->timeout, 195f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->default_response, requestor_id, text, 196f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->requestor_id_encoding, 197f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->text_encoding, extras); 198f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } else { 1993762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("out of memory in gps_ni_notify_callback\n"); 200f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 201f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 202f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id) 203f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(requestor_id); 204f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (text) 205f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(text); 206f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (extras) 207f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(extras); 208f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 209f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 210f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 21122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke XieGpsNiCallbacks sGpsNiCallbacks = { 21222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie gps_ni_notify_callback, 213f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 21422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie}; 21522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 2161e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_set_id(uint32_t flags) 2171e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 2181e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 2191e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestSetID, flags); 2201e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 2211e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 2221e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2231e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_ref_location(uint32_t flags) 2241e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 2251e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 2261e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestRefLocation, flags); 2271e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 2281e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 2291e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2301e84da822e7aa4d494b31c8759917d2751611f84Miguel TorrojaAGpsRilCallbacks sAGpsRilCallbacks = { 2311e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_set_id, 2321e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_ref_location, 2331e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja create_thread_callback, 2341e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja}; 2351e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 23658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwoodstatic void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) { 237b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood int err; 238b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood hw_module_t* module; 239bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 240bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportLocation = env->GetMethodID(clazz, "reportLocation", "(IDDDFFFJ)V"); 241bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V"); 242bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V"); 2438efd74dbedb65f69734318d9d6be70767f30b57aStephen Li method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(III)V"); 244bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V"); 245bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_setEngineCapabilities = env->GetMethodID(clazz, "setEngineCapabilities", "(I)V"); 246bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); 24758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", 24858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood "(IIIIILjava/lang/String;Ljava/lang/String;IILjava/lang/String;)V"); 249bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestRefLocation = env->GetMethodID(clazz,"requestRefLocation","(I)V"); 250bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestSetID = env->GetMethodID(clazz,"requestSetID","(I)V"); 2519b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood method_requestUtcTime = env->GetMethodID(clazz,"requestUtcTime","()V"); 25258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 25358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 25458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (err == 0) { 25558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood hw_device_t* device; 25658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device); 25758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (err == 0) { 25858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood gps_device_t* gps_device = (gps_device_t *)device; 25958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface = gps_device->get_gps_interface(gps_device); 26058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 26158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 26258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) { 26358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsXtraInterface = 26458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsXtraInterface*)sGpsInterface->get_extension(GPS_XTRA_INTERFACE); 26558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface = 26658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const AGpsInterface*)sGpsInterface->get_extension(AGPS_INTERFACE); 26758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface = 26858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsNiInterface*)sGpsInterface->get_extension(GPS_NI_INTERFACE); 26958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsDebugInterface = 27058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsDebugInterface*)sGpsInterface->get_extension(GPS_DEBUG_INTERFACE); 27158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface = 27258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const AGpsRilInterface*)sGpsInterface->get_extension(AGPS_RIL_INTERFACE); 27358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 274bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 275bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) { 27758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface != NULL); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 28258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // this must be set before calling into the HAL library 28358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!mCallbacksObj) 28458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood mCallbacksObj = env->NewGlobalRef(obj); 28558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 28658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // fail if the main interface fails to initialize 28758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) 28858bda987665af759c379cd494ff4873ac61acf29Mike Lockwood return false; 28958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 29058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // if XTRA initialization fails we will disable it by sGpsXtraInterface to null, 29158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // but continue to allow the rest of the GPS interface to work. 29258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsXtraInterface && sGpsXtraInterface->init(&sGpsXtraCallbacks) != 0) 29358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsXtraInterface = NULL; 29458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsInterface) 29558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->init(&sAGpsCallbacks); 29658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsNiInterface) 29758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface->init(&sGpsNiCallbacks); 29858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsRilInterface) 29958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->init(&sAGpsRilCallbacks); 3003c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 301c21a08f747f6fd1d7b8c98176ff70abc57cf58a0Mike Lockwood return true; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_cleanup(JNIEnv* env, jobject obj) 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 30658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 30758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->cleanup(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31004598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_set_position_mode(JNIEnv* env, jobject obj, 31104598b67a58fad93e5060bb77756ba4863013aedMike Lockwood jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 31358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 31458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface->set_position_mode(mode, recurrence, min_interval, preferred_accuracy, 3154270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood preferred_time) == 0); 3164270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 3174270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 31804598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32004598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj) 32104598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 32258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 32358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface->start() == 0); 3244270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 3254270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_stop(JNIEnv* env, jobject obj) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 33158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface->stop() == 0); 3324270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 3334270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_delete_aiding_data(JNIEnv* env, jobject obj, jint flags) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 33958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->delete_aiding_data(flags); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jint android_location_GpsLocationProvider_read_sv_status(JNIEnv* env, jobject obj, 34322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jintArray prnArray, jfloatArray snrArray, jfloatArray elevArray, jfloatArray azumArray, 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray maskArray) 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 346f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportSvStatus 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* prns = env->GetIntArrayElements(prnArray, 0); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* snrs = env->GetFloatArrayElements(snrArray, 0); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* elev = env->GetFloatArrayElements(elevArray, 0); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* azim = env->GetFloatArrayElements(azumArray, 0); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* mask = env->GetIntArrayElements(maskArray, 0); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 354f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int num_svs = sGpsSvStatus.num_svs; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < num_svs; i++) { 356f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood prns[i] = sGpsSvStatus.sv_list[i].prn; 357f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood snrs[i] = sGpsSvStatus.sv_list[i].snr; 358f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood elev[i] = sGpsSvStatus.sv_list[i].elevation; 359f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood azim[i] = sGpsSvStatus.sv_list[i].azimuth; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 361f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[0] = sGpsSvStatus.ephemeris_mask; 362f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[1] = sGpsSvStatus.almanac_mask; 363f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[2] = sGpsSvStatus.used_in_fix_mask; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(prnArray, prns, 0); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(snrArray, snrs, 0); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(elevArray, elev, 0); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(azumArray, azim, 0); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(maskArray, mask, 0); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return num_svs; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3731e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_reference_location_cellid(JNIEnv* env, 3741e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jint mcc, jint mnc, jint lac, jint cid) 3751e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 3761e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja AGpsRefLocation location; 37758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 37858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 3793762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in agps_set_reference_location_cellid"); 3801e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 381bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 382bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 3831e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja switch(type) { 3841e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_GSM_CELLID: 3851e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_UMTS_CELLID: 3861e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.type = type; 3871e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mcc = mcc; 3881e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mnc = mnc; 3891e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.lac = lac; 3901e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.cid = cid; 3911e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 3921e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja default: 3933762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Neither a GSM nor a UMTS cellid (%s:%d).",__FUNCTION__,__LINE__); 3941e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 3951e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 3961e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja } 39758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->set_ref_location(&location, sizeof(location)); 3981e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 3991e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 4001e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_send_ni_message(JNIEnv* env, 4011e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jbyteArray ni_msg, jint size) 4021e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 4031e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja size_t sz; 40458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 40558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 4063762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in send_ni_message"); 4071e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 408bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 4091e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja if (size < 0) 4101e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 4111e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja sz = (size_t)size; 4121e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jbyte* b = env->GetByteArrayElements(ni_msg, 0); 41358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->ni_message((uint8_t *)b,sz); 4141e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseByteArrayElements(ni_msg,b,0); 4151e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 4161e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 4171e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_id(JNIEnv *env, 4181e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jstring setid_string) 4191e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 42058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 4213762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in agps_set_id"); 4221e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 423bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 4241e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 4251e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja const char *setid = env->GetStringUTFChars(setid_string, NULL); 42658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->set_set_id(type, setid); 4271e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseStringUTFChars(setid_string, setid); 4281e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 4291e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 430f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj, 431f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyteArray nmeaArray, jint buffer_size) 432b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 433f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportNmea 434f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* nmea = (jbyte *)env->GetPrimitiveArrayCritical(nmeaArray, 0); 435f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int length = sNmeaStringLength; 436b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood if (length > buffer_size) 437b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood length = buffer_size; 438f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(nmea, sNmeaString, length); 439f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT); 440b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood return length; 441b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 442b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 443f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void android_location_GpsLocationProvider_inject_time(JNIEnv* env, jobject obj, 444f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jlong time, jlong timeReference, jint uncertainty) 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 44658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 44758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->inject_time(time, timeReference, uncertainty); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 450d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwoodstatic void android_location_GpsLocationProvider_inject_location(JNIEnv* env, jobject obj, 451d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood jdouble latitude, jdouble longitude, jfloat accuracy) 452d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood{ 45358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 45458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->inject_location(latitude, longitude, accuracy); 455d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood} 456d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_supports_xtra(JNIEnv* env, jobject obj) 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (sGpsXtraInterface != NULL); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray data, jint length) 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 46558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsXtraInterface) { 4663762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no XTRA interface in inject_xtra_data"); 46758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return; 46858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 46958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 470f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* bytes = (jbyte *)env->GetPrimitiveArrayCritical(data, 0); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sGpsXtraInterface->inject_xtra_data((char *)bytes, length); 472f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(data, bytes, JNI_ABORT); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 475e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv* env, jobject obj, jstring apn) 476105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 47758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 4783762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS interface in agps_data_conn_open"); 479bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 480105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 481bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (apn == NULL) { 482bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 483bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 484105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 485bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *apnStr = env->GetStringUTFChars(apn, NULL); 48658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_open(apnStr); 487bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(apn, apnStr); 488105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 489105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 490e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv* env, jobject obj) 491105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 49258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 4933762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS interface in agps_data_conn_open"); 494bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 49558bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 49658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_closed(); 49758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 49858bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 499e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_failed(JNIEnv* env, jobject obj) 50058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 50158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 5023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS interface in agps_data_conn_open"); 503bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 50458bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 50558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_failed(); 50658bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 50758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 508e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jobject obj, 509a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood jint type, jstring hostname, jint port) 51058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 51158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 5123762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS interface in agps_data_conn_open"); 513bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 515bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *c_hostname = env->GetStringUTFChars(hostname, NULL); 51658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->set_server(type, c_hostname, port); 517bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(hostname, c_hostname); 518105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 519105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 52022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_send_ni_response(JNIEnv* env, jobject obj, 52122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jint notifId, jint response) 52222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie{ 52358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsNiInterface) { 5243762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no NI interface in send_ni_response"); 525bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 5263c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 527bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 52858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface->respond(notifId, response); 5293c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger} 5303c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 5313c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic jstring android_location_GpsLocationProvider_get_internal_state(JNIEnv* env, jobject obj) 5323c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger{ 5333c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger jstring result = NULL; 5343c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (sGpsDebugInterface) { 5353c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger const size_t maxLength = 2047; 5363c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger char buffer[maxLength+1]; 5373c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger size_t length = sGpsDebugInterface->get_internal_state(buffer, maxLength); 5383c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (length > maxLength) length = maxLength; 5393c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger buffer[length] = 0; 5403c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger result = env->NewStringUTF(buffer); 5413c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 5423c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger return result; 54322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 54422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 54550130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwoodstatic void android_location_GpsLocationProvider_update_network_state(JNIEnv* env, jobject obj, 546a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang jboolean connected, int type, jboolean roaming, jboolean available, jstring extraInfo, jstring apn) 54750130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood{ 54858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 54958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsRilInterface && sAGpsRilInterface->update_network_state) { 55050130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood if (extraInfo) { 55150130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood const char *extraInfoStr = env->GetStringUTFChars(extraInfo, NULL); 55258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->update_network_state(connected, type, roaming, extraInfoStr); 55350130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood env->ReleaseStringUTFChars(extraInfo, extraInfoStr); 55450130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } else { 55558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->update_network_state(connected, type, roaming, NULL); 55650130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 557a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang 558a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang // update_network_availability callback was not included in original AGpsRilInterface 559a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang if (sAGpsRilInterface->size >= sizeof(AGpsRilInterface) 560a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang && sAGpsRilInterface->update_network_availability) { 561a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang const char *c_apn = env->GetStringUTFChars(apn, NULL); 562a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang sAGpsRilInterface->update_network_availability(available, c_apn); 563a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang env->ReleaseStringUTFChars(apn, c_apn); 564a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang } 56550130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 56650130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood} 56750130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod sMethods[] = { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, 571e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported}, 572e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}, 573e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup}, 57404598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_set_position_mode", "(IIIII)Z", (void*)android_location_GpsLocationProvider_set_position_mode}, 57504598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_start", "()Z", (void*)android_location_GpsLocationProvider_start}, 576e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_stop", "()Z", (void*)android_location_GpsLocationProvider_stop}, 577e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_delete_aiding_data", "(I)V", (void*)android_location_GpsLocationProvider_delete_aiding_data}, 578e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_read_sv_status", "([I[F[F[F[I)I", (void*)android_location_GpsLocationProvider_read_sv_status}, 579f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood {"native_read_nmea", "([BI)I", (void*)android_location_GpsLocationProvider_read_nmea}, 580e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_time", "(JJI)V", (void*)android_location_GpsLocationProvider_inject_time}, 581d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood {"native_inject_location", "(DDF)V", (void*)android_location_GpsLocationProvider_inject_location}, 582e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_supports_xtra", "()Z", (void*)android_location_GpsLocationProvider_supports_xtra}, 583e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_xtra_data", "([BI)V", (void*)android_location_GpsLocationProvider_inject_xtra_data}, 584e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_open", "(Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_agps_data_conn_open}, 585e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_closed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_closed}, 586e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_failed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_failed}, 5871e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_set_id","(ILjava/lang/String;)V",(void*)android_location_GpsLocationProvider_agps_set_id}, 5881e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_set_ref_location_cellid","(IIIII)V",(void*)android_location_GpsLocationProvider_agps_set_reference_location_cellid}, 589a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood {"native_set_agps_server", "(ILjava/lang/String;I)V", (void*)android_location_GpsLocationProvider_set_agps_server}, 59022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie {"native_send_ni_response", "(II)V", (void*)android_location_GpsLocationProvider_send_ni_response}, 5911e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_ni_message", "([BI)V", (void *)android_location_GpsLocationProvider_agps_send_ni_message}, 5923c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger {"native_get_internal_state", "()Ljava/lang/String;", (void*)android_location_GpsLocationProvider_get_internal_state}, 593a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang {"native_update_network_state", "(ZIZZLjava/lang/String;Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_update_network_state }, 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59600b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodint register_android_server_location_GpsLocationProvider(JNIEnv* env) 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 59800b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwood return jniRegisterNativeMethods(env, "com/android/server/location/GpsLocationProvider", sMethods, NELEM(sMethods)); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} /* namespace android */ 602