jni_helper.cpp revision c96feb800590f43b7be76d1000ab5d949e5c6790
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
78c96feb800590f43b7be76d1000ab5d949e5c6790xinhejbyte getByteField(JNIEnv *env, jobject obj, const char *name)
79c96feb800590f43b7be76d1000ab5d949e5c6790xinhe{
80c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    jclass cls = (env)->GetObjectClass(obj);
81c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    jfieldID field = (env)->GetFieldID(cls, name, "B");
82c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    if (field == 0) {
83c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        THROW(env, "Error in accessing field");
84c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        return 0;
85c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    }
86c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
87c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    jbyte value = (env)->GetByteField(obj, field);
88c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    env->DeleteLocalRef(cls);
89c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    return value;
90c96feb800590f43b7be76d1000ab5d949e5c6790xinhe}
91c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndejlong getLongField(JNIEnv *env, jobject obj, const char *name)
937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, "J");
967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == 0) {
977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return 0;
997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
1007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlong value = (env)->GetLongField(obj, field);
102e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
103e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    return value;
104e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
105e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
106aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallejlong getStaticLongField(JNIEnv *env, jobject obj, const char *name)
107aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
108aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jclass cls = (env)->GetObjectClass(obj);
109b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    jlong result = getStaticLongField(env, cls, name);
110b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    env->DeleteLocalRef(cls);
111b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    return result;
112b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
113b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
114b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandejlong getStaticLongField(JNIEnv *env, jclass cls, const char *name)
115b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
116aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jfieldID field = (env)->GetStaticFieldID(cls, name, "J");
117aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == 0) {
118aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing field");
119aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return 0;
120aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
121b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    ALOGE("getStaticLongField %s %p", name, cls);
122aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
123b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    return (env)->GetStaticLongField(cls, field);
124aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
125aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
126e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndejobject getObjectField(JNIEnv *env, jobject obj, const char *name, const char *type)
127e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{
128e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
129e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, type);
130e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (field == 0) {
131e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        THROW(env, "Error in accessing field");
132e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return 0;
133e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
134e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
135e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jobject value = (env)->GetObjectField(obj, field);
136e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
1377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    return value;
1387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
1397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndejlong getLongArrayField(JNIEnv *env, jobject obj, const char *name, int index)
1417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
1427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
1437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, "[J");
1447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == 0) {
1457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field definition");
1467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return 0;
1477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
1487f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlongArray array = (jlongArray)(env)->GetObjectField(obj, field);
15051da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande    if (array == NULL) {
15151da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande        THROW(env, "Error in accessing array");
15251da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande        return 0;
15351da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande    }
15451da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande
1557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlong *elem = (env)->GetLongArrayElements(array, 0);
1567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (elem == NULL) {
1577f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing index element");
1587f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return 0;
1597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
1607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlong value = elem[index];
1627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    (env)->ReleaseLongArrayElements(array, elem, 0);
163e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
164e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(array);
165e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
166e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    return value;
1687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
1697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
170aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallejlong getStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, int index)
171aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
172aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jclass cls = (env)->GetObjectClass(obj);
173b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    jlong result = getStaticLongArrayField(env, cls, name, index);
174b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    env->DeleteLocalRef(cls);
175b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    return result;
176b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
177b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
178b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandejlong getStaticLongArrayField(JNIEnv *env, jclass cls, const char *name, int index)
179b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
180aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jfieldID field = (env)->GetStaticFieldID(cls, name, "[J");
181aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == 0) {
182aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing field definition");
183aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return 0;
184aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
185aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
186aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jlongArray array = (jlongArray)(env)->GetStaticObjectField(cls, field);
187aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jlong *elem = (env)->GetLongArrayElements(array, 0);
188aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (elem == NULL) {
189aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing index element");
190aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return 0;
191aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
192aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
193aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jlong value = elem[index];
194aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    (env)->ReleaseLongArrayElements(array, elem, 0);
195aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
196aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    env->DeleteLocalRef(array);
197aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    return value;
198aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
199aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
200e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndejobject getObjectArrayField(JNIEnv *env, jobject obj, const char *name, const char *type, int index)
201e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{
202e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
203e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, type);
204e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (field == 0) {
205e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        THROW(env, "Error in accessing field definition");
206e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return 0;
207e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
208e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
209e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jobjectArray array = (jobjectArray)(env)->GetObjectField(obj, field);
210e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    jobject elem = (env)->GetObjectArrayElement(array, index);
211e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (elem == NULL) {
212e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        THROW(env, "Error in accessing index element");
213e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return 0;
214e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
215e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
216e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(array);
217e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
218e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    return elem;
219e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
220e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
2217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setIntField(JNIEnv *env, jobject obj, const char *name, jint value)
2227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
2237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
2247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
2257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing class");
2267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
2277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, "I");
2307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
2317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
2327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
2337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    (env)->SetIntField(obj, field, value);
236e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
2377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
2387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
239c96feb800590f43b7be76d1000ab5d949e5c6790xinhevoid setByteField(JNIEnv *env, jobject obj, const char *name, jbyte value)
240c96feb800590f43b7be76d1000ab5d949e5c6790xinhe{
241c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    jclass cls = (env)->GetObjectClass(obj);
242c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    if (cls == NULL) {
243c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        THROW(env, "Error in accessing class");
244c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        return;
245c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    }
246c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
247c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    jfieldID field = (env)->GetFieldID(cls, name, "B");
248c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    if (field == NULL) {
249c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        THROW(env, "Error in accessing field");
250c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        return;
251c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    }
252c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
253c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    (env)->SetByteField(obj, field, value);
254c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    env->DeleteLocalRef(cls);
255c96feb800590f43b7be76d1000ab5d949e5c6790xinhe}
256c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
25712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhevoid setBooleanField(JNIEnv *env, jobject obj, const char *name, jboolean value)
25812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe{
25912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    jclass cls = (env)->GetObjectClass(obj);
26012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    if (cls == NULL) {
26112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe        THROW(env, "Error in accessing class");
26212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe        return;
26312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    }
26412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe
26512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    jfieldID field = (env)->GetFieldID(cls, name, "Z");
26612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    if (field == NULL) {
26712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe        THROW(env, "Error in accessing field");
26812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe        return;
26912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    }
27012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe
27112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    (env)->SetBooleanField(obj, field, value);
27212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    env->DeleteLocalRef(cls);
27312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe}
27412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe
2757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setLongField(JNIEnv *env, jobject obj, const char *name, jlong value)
2767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
2777f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
2787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
2797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing class");
2807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
2817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, "J");
2847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
2857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
2867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
2877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    (env)->SetLongField(obj, field, value);
290e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
2917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
2927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
293aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid setStaticLongField(JNIEnv *env, jobject obj, const char *name, jlong value)
294aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
295aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jclass cls = (env)->GetObjectClass(obj);
296aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (cls == NULL) {
297aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing class");
298aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
299aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
300aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
301b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    setStaticLongField(env, cls, name, value);
302b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    env->DeleteLocalRef(cls);
303b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
304b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
305b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandevoid setStaticLongField(JNIEnv *env, jclass cls, const char *name, jlong value)
306b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
307aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jfieldID field = (env)->GetStaticFieldID(cls, name, "J");
308aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == NULL) {
309aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing field");
310aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
311aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
312aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
313aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    (env)->SetStaticLongField(cls, field, value);
314aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
315aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
3167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value)
3177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
3187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
3197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
3207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
3217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    } else {
3237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGD("cls = %p", cls);
3247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, "[J");
3277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
3287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
3297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    (env)->SetObjectField(obj, field, value);
3337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    ALOGD("array field set");
334e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
335e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
3367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
3377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
338aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid setStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value)
339aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
340aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jclass cls = (env)->GetObjectClass(obj);
341aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (cls == NULL) {
342aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing field");
343aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
344aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    } else {
345aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        ALOGD("cls = %p", cls);
346aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
347aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
348b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    setStaticLongArrayField(env, cls, name, value);
349b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    env->DeleteLocalRef(cls);
350b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
351b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
352b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandevoid setStaticLongArrayField(JNIEnv *env, jclass cls, const char *name, jlongArray value)
353b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
354aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jfieldID field = (env)->GetStaticFieldID(cls, name, "[J");
355aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == NULL) {
356aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        THROW(env, "Error in accessing field");
357aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
358aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
359aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
360aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    (env)->SetStaticObjectField(cls, field, value);
361aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    ALOGD("array field set");
362aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
363aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
3647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setLongArrayElement(JNIEnv *env, jobject obj, const char *name, int index, jlong value)
3657f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
3667f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
3677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
3687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
3697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3707f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    } else {
3717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGD("cls = %p", cls);
3727f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, "[J");
3757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
3767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
3777f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    } else {
3797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGD("field = %p", field);
3807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlongArray array = (jlongArray)(env)->GetObjectField(obj, field);
3837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (array == NULL) {
3847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing array");
3857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    } else {
3877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGD("array = %p", array);
3887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlong *elem = (env)->GetLongArrayElements(array, NULL);
3917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (elem == NULL) {
3927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing index element");
3937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    elem[index] = value;
397e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->ReleaseLongArrayElements(array, elem, 0);
398e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(array);
399e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
4007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setObjectField(JNIEnv *env, jobject obj, const char *name, const char *type, jobject value)
4037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = (env)->GetObjectClass(obj);
4057f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
4067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing class");
4077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jfieldID field = (env)->GetFieldID(cls, name, type);
4117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
4127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing field");
4137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    (env)->SetObjectField(obj, field, value);
417e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
4187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndevoid setStringField(JNIEnv *env, jobject obj, const char *name, const char *value)
4217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jstring str = env->NewStringUTF(value);
4237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (str == NULL) {
4257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        THROW(env, "Error in accessing class");
4267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    setObjectField(env, obj, name, "Ljava/lang/String;", str);
430e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(str);
4317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
433b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandevoid reportEvent(JNIEnv *env, jclass cls, const char *method, const char *signature, ...)
4347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    va_list params;
4367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    va_start(params, signature);
4377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
438b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    jmethodID methodID = env->GetStaticMethodID(cls, method, signature);
4397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (method == NULL) {
4407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGE("Error in getting method ID");
4417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
444b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    env->CallStaticVoidMethodV(cls, methodID, params);
4457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    va_end(params);
4467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4487f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndejobject createObject(JNIEnv *env, const char *className)
4497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4507f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jclass cls = env->FindClass(className);
4517f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
45283a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in finding class %s", className);
4537f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return NULL;
4547f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jmethodID constructor = env->GetMethodID(cls, "<init>", "()V");
4577f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (constructor == NULL) {
45883a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in constructor ID for %s", className);
4597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return NULL;
4607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jobject obj = env->NewObject(cls, constructor);
4627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (constructor == NULL) {
4637f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGE("Could not create new object of %s", className);
4647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return NULL;
4657f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4667f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
467e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    env->DeleteLocalRef(cls);
4687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    return obj;
4697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4707f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
47183a674a18c84ff4f01377bbfd8988699dec93bc2Vinit DeshpandejobjectArray createObjectArray(JNIEnv *env, const char *className, int num)
47283a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande{
47383a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    jclass cls = env->FindClass(className);
47483a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    if (cls == NULL) {
47583a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in finding class %s", className);
47683a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        return NULL;
47783a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    }
47883a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
47983a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    jobjectArray array = env->NewObjectArray(num, cls, NULL);
48083a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    if (array == NULL) {
48183a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in creating array of class %s", className);
48283a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        return NULL;
48383a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    }
48483a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
48583a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    env->DeleteLocalRef(cls);
48683a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    return array;
48783a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande}
48883a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
4897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}; // namespace android
4907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
492