17f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* 27f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * Copyright 2008, The Android Open Source Project 37f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * 47f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * Licensed under the Apache License, Version 2.0 (the "License"); 57f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * you may not use this file except in compliance with the License. 67f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * You may obtain a copy of the License at 77f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * 87f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * http://www.apache.org/licenses/LICENSE-2.0 97f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * 107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * Unless required by applicable law or agreed to in writing, software 117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * distributed under the License is distributed on an "AS IS" BASIS, 127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * See the License for the specific language governing permissions and 147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde * limitations under the License. 157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde */ 167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#define LOG_TAG "wifi" 187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "jni.h" 207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include <ScopedUtfChars.h> 217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include <utils/misc.h> 227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include <android_runtime/AndroidRuntime.h> 237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include <utils/Log.h> 247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include <utils/String16.h> 257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "wifi.h" 277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "wifi_hal.h" 287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "jni_helper.h" 297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndenamespace android { 317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* JNI Helpers for wifi_hal implementation */ 337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid throwException( JNIEnv *env, const char *message, int line ) 357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("error at line %d: %s", line, message); 377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde const char *className = "java/lang/Exception"; 397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass exClass = (env)->FindClass(className ); 417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if ( exClass == NULL ) { 427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Could not find exception class to throw error"); 437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("error at line %d: %s", line, message); 447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde (env)->ThrowNew(exClass, message); 487f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 50e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndejboolean getBoolField(JNIEnv *env, jobject obj, const char *name) 51e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{ 52e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 53e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "Z"); 54e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (field == 0) { 55e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde THROW(env, "Error in accessing field"); 56e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 57e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 58e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 59e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jboolean value = (env)->GetBooleanField(obj, field); 60e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 61e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return value; 62e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 63e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 64e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndejint getIntField(JNIEnv *env, jobject obj, const char *name) 65e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{ 66e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 67e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "I"); 68e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (field == 0) { 69e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde THROW(env, "Error in accessing field"); 70e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 71e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 72e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 73e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jint value = (env)->GetIntField(obj, field); 74e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 75e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return value; 76e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 77e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndejlong getLongField(JNIEnv *env, jobject obj, const char *name) 797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "J"); 827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == 0) { 837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong value = (env)->GetLongField(obj, field); 88e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 89e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return value; 90e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 91e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 92aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallejlong getStaticLongField(JNIEnv *env, jobject obj, const char *name) 93aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 94aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jclass cls = (env)->GetObjectClass(obj); 95b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande jlong result = getStaticLongField(env, cls, name); 96b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteLocalRef(cls); 97b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return result; 98b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande} 99b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande 100b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandejlong getStaticLongField(JNIEnv *env, jclass cls, const char *name) 101b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{ 102aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jfieldID field = (env)->GetStaticFieldID(cls, name, "J"); 103aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (field == 0) { 104aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing field"); 105aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 106aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 107b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGE("getStaticLongField %s %p", name, cls); 108aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 109b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return (env)->GetStaticLongField(cls, field); 110aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 111aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 112e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndejobject getObjectField(JNIEnv *env, jobject obj, const char *name, const char *type) 113e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{ 114e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 115e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, type); 116e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (field == 0) { 117e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde THROW(env, "Error in accessing field"); 118e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 119e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 120e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 121e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject value = (env)->GetObjectField(obj, field); 122e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 1237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return value; 1247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndejlong getLongArrayField(JNIEnv *env, jobject obj, const char *name, int index) 1277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 1287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 1297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "[J"); 1307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == 0) { 1317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field definition"); 1327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 1337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 1347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlongArray array = (jlongArray)(env)->GetObjectField(obj, field); 13651da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande if (array == NULL) { 13751da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande THROW(env, "Error in accessing array"); 13851da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande return 0; 13951da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande } 14051da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande 1417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong *elem = (env)->GetLongArrayElements(array, 0); 1427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (elem == NULL) { 1437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing index element"); 1447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 1457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 1467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong value = elem[index]; 1487f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde (env)->ReleaseLongArrayElements(array, elem, 0); 149e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 150e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(array); 151e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 152e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1537f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return value; 1547f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 156aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallejlong getStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, int index) 157aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 158aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jclass cls = (env)->GetObjectClass(obj); 159b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande jlong result = getStaticLongArrayField(env, cls, name, index); 160b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteLocalRef(cls); 161b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return result; 162b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande} 163b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande 164b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandejlong getStaticLongArrayField(JNIEnv *env, jclass cls, const char *name, int index) 165b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{ 166aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jfieldID field = (env)->GetStaticFieldID(cls, name, "[J"); 167aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (field == 0) { 168aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing field definition"); 169aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 170aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 171aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 172aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jlongArray array = (jlongArray)(env)->GetStaticObjectField(cls, field); 173aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jlong *elem = (env)->GetLongArrayElements(array, 0); 174aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (elem == NULL) { 175aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing index element"); 176aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 177aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 178aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 179aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jlong value = elem[index]; 180aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (env)->ReleaseLongArrayElements(array, elem, 0); 181aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 182aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle env->DeleteLocalRef(array); 183aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return value; 184aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 185aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 186e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndejobject getObjectArrayField(JNIEnv *env, jobject obj, const char *name, const char *type, int index) 187e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{ 188e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 189e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, type); 190e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (field == 0) { 191e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde THROW(env, "Error in accessing field definition"); 192e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 193e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 194e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 195e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray array = (jobjectArray)(env)->GetObjectField(obj, field); 196e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject elem = (env)->GetObjectArrayElement(array, index); 197e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (elem == NULL) { 198e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde THROW(env, "Error in accessing index element"); 199e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 200e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 201e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 202e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(array); 203e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 204e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return elem; 205e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 206e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 2077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setIntField(JNIEnv *env, jobject obj, const char *name, jint value) 2087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 2097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 2107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (cls == NULL) { 2117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing class"); 2127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 2137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "I"); 2167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == NULL) { 2177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 2187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 2197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde (env)->SetIntField(obj, field, value); 222e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 2237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setLongField(JNIEnv *env, jobject obj, const char *name, jlong value) 2267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 2277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 2287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (cls == NULL) { 2297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing class"); 2307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 2317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "J"); 2347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == NULL) { 2357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 2367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 2377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde (env)->SetLongField(obj, field, value); 240e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 2417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 243aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid setStaticLongField(JNIEnv *env, jobject obj, const char *name, jlong value) 244aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 245aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jclass cls = (env)->GetObjectClass(obj); 246aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (cls == NULL) { 247aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing class"); 248aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return; 249aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 250aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 251b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, cls, name, value); 252b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteLocalRef(cls); 253b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande} 254b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande 255b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandevoid setStaticLongField(JNIEnv *env, jclass cls, const char *name, jlong value) 256b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{ 257aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jfieldID field = (env)->GetStaticFieldID(cls, name, "J"); 258aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (field == NULL) { 259aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing field"); 260aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return; 261aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 262aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 263aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (env)->SetStaticLongField(cls, field, value); 264aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 265aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 2667f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value) 2677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 2687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 2697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (cls == NULL) { 2707f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 2717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 2727f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 2737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGD("cls = %p", cls); 2747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "[J"); 2777f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == NULL) { 2787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 2797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 2807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde (env)->SetObjectField(obj, field, value); 2837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGD("array field set"); 284e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 285e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 2867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 288aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid setStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value) 289aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 290aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jclass cls = (env)->GetObjectClass(obj); 291aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (cls == NULL) { 292aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing field"); 293aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return; 294aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } else { 295aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGD("cls = %p", cls); 296aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 297aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 298b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongArrayField(env, cls, name, value); 299b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteLocalRef(cls); 300b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande} 301b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande 302b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandevoid setStaticLongArrayField(JNIEnv *env, jclass cls, const char *name, jlongArray value) 303b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{ 304aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jfieldID field = (env)->GetStaticFieldID(cls, name, "[J"); 305aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (field == NULL) { 306aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "Error in accessing field"); 307aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return; 308aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 309aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 310aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (env)->SetStaticObjectField(cls, field, value); 311aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGD("array field set"); 312aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 313aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 3147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setLongArrayElement(JNIEnv *env, jobject obj, const char *name, int index, jlong value) 3157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 3167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 3177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (cls == NULL) { 3187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 3197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 3217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGD("cls = %p", cls); 3227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, "[J"); 3257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == NULL) { 3267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 3277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 3297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGD("field = %p", field); 3307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlongArray array = (jlongArray)(env)->GetObjectField(obj, field); 3337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (array == NULL) { 3347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing array"); 3357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 3377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGD("array = %p", array); 3387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong *elem = (env)->GetLongArrayElements(array, NULL); 3417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (elem == NULL) { 3427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing index element"); 3437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde elem[index] = value; 347e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->ReleaseLongArrayElements(array, elem, 0); 348e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(array); 349e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 3507f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 3517f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3527f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setObjectField(JNIEnv *env, jobject obj, const char *name, const char *type, jobject value) 3537f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 3547f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = (env)->GetObjectClass(obj); 3557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (cls == NULL) { 3567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing class"); 3577f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3587f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jfieldID field = (env)->GetFieldID(cls, name, type); 3617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (field == NULL) { 3627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing field"); 3637f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3657f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3667f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde (env)->SetObjectField(obj, field, value); 367e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 3687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 3697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3707f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setStringField(JNIEnv *env, jobject obj, const char *name, const char *value) 3717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 3727f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jstring str = env->NewStringUTF(value); 3737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (str == NULL) { 3757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing class"); 3767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3777f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setObjectField(env, obj, name, "Ljava/lang/String;", str); 380e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(str); 3817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 3827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 383b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandevoid reportEvent(JNIEnv *env, jclass cls, const char *method, const char *signature, ...) 3847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 3857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde va_list params; 3867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde va_start(params, signature); 3877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 388b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande jmethodID methodID = env->GetStaticMethodID(cls, method, signature); 3897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (method == NULL) { 3907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in getting method ID"); 3917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 3927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 394b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->CallStaticVoidMethodV(cls, methodID, params); 3957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde va_end(params); 3967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 3977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndejobject createObject(JNIEnv *env, const char *className) 3997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{ 4007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jclass cls = env->FindClass(className); 4017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (cls == NULL) { 4027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in finding class"); 4037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 4047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4057f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 4067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jmethodID constructor = env->GetMethodID(cls, "<init>", "()V"); 4077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (constructor == NULL) { 4087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in constructor ID"); 4097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 4107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jobject obj = env->NewObject(cls, constructor); 4127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (constructor == NULL) { 4137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Could not create new object of %s", className); 4147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 4157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 417e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->DeleteLocalRef(cls); 4187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return obj; 4197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 4207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 4217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}; // namespace android 4227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 4237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 424