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