jni_helper.cpp revision 7d519b6686ece717fd3890c0656b46155c22a377
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
347d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIHelper::JNIHelper(JavaVM *vm)
357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    vm->AttachCurrentThread(&mEnv, NULL);
377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mVM = vm;
387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
407d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIHelper::JNIHelper(JNIEnv *env)
417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mVM  = NULL;
437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv = env;
447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
467d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIHelper::~JNIHelper()
477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (mVM != NULL) {
497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        // mVM->DetachCurrentThread();  /* 'attempting to detach while still running code' */
507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mVM = NULL;                     /* not really required; but may help debugging */
517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv = NULL;                    /* not really required; but may help debugging */
527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejobject JNIHelper::newGlobalRef(jobject obj) {
567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->NewGlobalRef(obj);
577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::deleteGlobalRef(jobject obj) {
607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->DeleteGlobalRef(obj);
617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejobject JNIHelper::newLocalRef(jobject obj) {
647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->NewLocalRef(obj);
657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::deleteLocalRef(jobject obj) {
687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->DeleteLocalRef(obj);
697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::throwException(const char *message, int line)
727f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    ALOGE("error at line %d: %s", line, message);
747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    const char *className = "java/lang/Exception";
767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jclass exClass = mEnv->FindClass(className );
787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if ( exClass == NULL ) {
797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGE("Could not find exception class to throw error");
807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGE("error at line %d: %s", line, message);
817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->ThrowNew(exClass, message);
857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejboolean JNIHelper::getBoolField(jobject obj, const char *name)
88e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{
897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "Z");
91e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (field == 0) {
927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
93e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return 0;
94e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
95e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->GetBooleanField(obj, field);
97e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
98e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejint JNIHelper::getIntField(jobject obj, const char *name)
100e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{
1017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
1027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "I");
103e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (field == 0) {
1047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
105e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return 0;
106e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
107e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->GetIntField(obj, field);
109e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
110e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejbyte JNIHelper::getByteField(jobject obj, const char *name)
112c96feb800590f43b7be76d1000ab5d949e5c6790xinhe{
1137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
1147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "B");
115c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    if (field == 0) {
1167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
117c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        return 0;
118c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    }
119c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
1207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->GetByteField(obj, field);
121c96feb800590f43b7be76d1000ab5d949e5c6790xinhe}
122c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
1237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejlong JNIHelper::getLongField(jobject obj, const char *name)
1247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
1257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
1267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "J");
1277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == 0) {
1287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
1297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return 0;
1307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
1317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->GetLongField(obj, field);
133e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
134e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1357d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jstring> JNIHelper::getStringField(jobject obj, const char *name)
136aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
1377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> m = getObjectField(obj, name, "Ljava/lang/String;");
1387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (m == NULL) {
1397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
1407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jstring>(*this, NULL);
1417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
1427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jstring>(*this, (jstring)m.detach());
144b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
145b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
1467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandebool JNIHelper::getStringFieldValue(jobject obj, const char *name, char *buf, int size)
147b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
1487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
1497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "Ljava/lang/String;");
150aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == 0) {
1517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
152aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return 0;
153aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
154aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
1557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> value(*this, mEnv->GetObjectField(obj, field));
1567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jstring> string(*this, (jstring)value.clone());
1577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    ScopedUtfChars chars(mEnv, string);
1587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    const char *utf = chars.c_str();
1607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (utf == NULL) {
1617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing value");
1627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return false;
1637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
1647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (*utf != 0 && size < 1) {
1667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return false;
1677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
1687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    strncpy(buf, utf, size);
1707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (size > 0) {
1717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        buf[size - 1] = 0;
1727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
1737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return true;
1757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
1767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejlong JNIHelper::getStaticLongField(jobject obj, const char *name)
1787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
1797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
1807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return getStaticLongField(cls, name);
181aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
182aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
1837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejlong JNIHelper::getStaticLongField(jclass cls, const char *name)
184e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{
1857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetStaticFieldID(cls, name, "J");
186e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (field == 0) {
1877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
188e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return 0;
189e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    //ALOGE("getStaticLongField %s %p", name, cls);
1917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->GetStaticLongField(cls, field);
1927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
193e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1947d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobject> JNIHelper::getObjectField(jobject obj, const char *name, const char *type)
1957d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
1967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
1977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, type);
1987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (field == 0) {
1997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
2007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobject>(*this, NULL);
2017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
2027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
2037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jobject>(*this, mEnv->GetObjectField(obj, field));
2047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
2057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
2067d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobjectArray> JNIHelper::getArrayField(jobject obj, const char *name, const char *type)
2077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
2087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
2097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, type);
2107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (field == 0) {
2117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
2127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobjectArray>(*this, NULL);
2137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
2147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
2157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jobjectArray>(*this, (jobjectArray)mEnv->GetObjectField(obj, field));
2167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
2177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejlong JNIHelper::getLongArrayField(jobject obj, const char *name, int index)
2197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
2207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
2217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "[J");
2227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == 0) {
2237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field definition");
2247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return 0;
2257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jlongArray> array(*this, (jlongArray)mEnv->GetObjectField(obj, field));
22851da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande    if (array == NULL) {
2297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing array");
23051da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande        return 0;
23151da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande    }
23251da80208c650a8271a18b0ca8681279ba060e1fVinit Deshpande
2337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong *elem = mEnv->GetLongArrayElements(array, 0);
2347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (elem == NULL) {
2357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing index element");
2367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return 0;
2377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    jlong value = elem[index];
2407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->ReleaseLongArrayElements(array, elem, 0);
2417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    return value;
2427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
2437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejlong JNIHelper::getStaticLongArrayField(jobject obj, const char *name, int index)
245aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
2467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
2477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return getStaticLongArrayField(cls, name, index);
248b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
249b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
2507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejlong JNIHelper::getStaticLongArrayField(jclass cls, const char *name, int index)
251b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
2527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetStaticFieldID(cls, name, "[J");
253aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == 0) {
2547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field definition");
255aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return 0;
256aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
257aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
2587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jlongArray> array(*this, (jlongArray)mEnv->GetStaticObjectField(cls, field));
2597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong *elem = mEnv->GetLongArrayElements(array, 0);
260aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (elem == NULL) {
2617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing index element");
262aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return 0;
263aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
264aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
265aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    jlong value = elem[index];
2667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->ReleaseLongArrayElements(array, elem, 0);
267aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    return value;
268aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
269aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
2707d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobject> JNIHelper::getObjectArrayField(jobject obj, const char *name, const char *type,
2717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeint index)
272e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde{
2737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
2747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, type);
275e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (field == 0) {
2767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field definition");
2777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobject>(*this, NULL);
278e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
279e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
2807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobjectArray> array(*this, (jobjectArray)mEnv->GetObjectField(obj, field));
2817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> elem(*this, mEnv->GetObjectArrayElement(array, index));
2827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (elem.isNull()) {
2837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing index element");
2847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobject>(*this, NULL);
285e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
286e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    return elem;
287e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
288e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
2897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setIntField(jobject obj, const char *name, jint value)
2907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
2917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
2927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
2937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing class");
2947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
2957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
2967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
2977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "I");
2987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
2997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
3007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetIntField(obj, field, value);
3047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
3057f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setByteField(jobject obj, const char *name, jbyte value)
307c96feb800590f43b7be76d1000ab5d949e5c6790xinhe{
3087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
309c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    if (cls == NULL) {
3107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing class");
311c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        return;
312c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    }
313c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
3147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "B");
315c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    if (field == NULL) {
3167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
317c96feb800590f43b7be76d1000ab5d949e5c6790xinhe        return;
318c96feb800590f43b7be76d1000ab5d949e5c6790xinhe    }
319c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
3207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetByteField(obj, field, value);
321c96feb800590f43b7be76d1000ab5d949e5c6790xinhe}
322c96feb800590f43b7be76d1000ab5d949e5c6790xinhe
3237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setBooleanField(jobject obj, const char *name, jboolean value)
32412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe{
3257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
32612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    if (cls == NULL) {
3277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing class");
32812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe        return;
32912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    }
33012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe
3317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "Z");
33212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    if (field == NULL) {
3337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
33412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe        return;
33512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    }
33612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe
3377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetBooleanField(obj, field, value);
33812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe}
33912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe
3407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setLongField(jobject obj, const char *name, jlong value)
3417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
3427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
3437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
3447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing class");
3457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "J");
3497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
3507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
3517f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3527f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3537f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetLongField(obj, field, value);
3557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
3567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setStaticLongField(jobject obj, const char *name, jlong value)
358aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
3597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
360aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (cls == NULL) {
3617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing class");
362aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
363aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
364aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
3657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    setStaticLongField(cls, name, value);
366b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
367b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
3687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setStaticLongField(jclass cls, const char *name, jlong value)
369b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
3707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetStaticFieldID(cls, name, "J");
371aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == NULL) {
3727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
373aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
374aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
375aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
3767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetStaticLongField(cls, field, value);
377aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
378aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
3797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setLongArrayField(jobject obj, const char *name, jlongArray value)
3807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
3817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
3827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
3837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
3847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "[J");
3887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
3897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
3907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
3917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
3927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetObjectField(obj, field, value);
3947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
3957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
3967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setStaticLongArrayField(jobject obj, const char *name, jlongArray value)
397aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{
3987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
399aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (cls == NULL) {
4007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
401aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
402aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
403aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
4047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    setStaticLongArrayField(cls, name, value);
405b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande}
406b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
4077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setStaticLongArrayField(jclass cls, const char *name, jlongArray value)
408b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande{
4097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetStaticFieldID(cls, name, "[J");
410aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    if (field == NULL) {
4117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
412aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle        return;
413aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    }
414aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
4157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetStaticObjectField(cls, field, value);
416aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle    ALOGD("array field set");
417aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle}
418aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle
4197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setLongArrayElement(jobject obj, const char *name, int index, jlong value)
4207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
4227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
4237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
4247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, "[J");
4287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
4297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
4307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jlongArray> array(*this, (jlongArray)mEnv->GetObjectField(obj, field));
4347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (array == NULL) {
4357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing array");
4367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong *elem = mEnv->GetLongArrayElements(array, NULL);
4407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (elem == NULL) {
4417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing index element");
4427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    elem[index] = value;
4467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->ReleaseLongArrayElements(array, elem, 0);
4477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4487f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setObjectField(jobject obj, const char *name, const char *type, jobject value)
4507f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->GetObjectClass(obj));
4527f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
4537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing class");
4547f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jfieldID field = mEnv->GetFieldID(cls, name, type);
4587f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (field == NULL) {
4597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error in accessing field");
4607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetObjectField(obj, field, value);
4647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4657f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejboolean JNIHelper::setStringField(jobject obj, const char *name, const char *value)
4677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jstring> str(*this, mEnv->NewStringUTF(value));
4695cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe
4707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (mEnv->ExceptionCheck()) {
4717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv->ExceptionDescribe();
4727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv->ExceptionClear();
4735cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe        return false;
4745cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe    }
4755cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe
4767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (str == NULL) {
4777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        THROW(*this, "Error creating string");
4785cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe        return false;
4797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    setObjectField(obj, name, "Ljava/lang/String;", str);
4825cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe    return true;
4837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
4847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::reportEvent(jclass cls, const char *method, const char *signature, ...)
4867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
4877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    va_list params;
4887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    va_start(params, signature);
4897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jmethodID methodID = mEnv->GetStaticMethodID(cls, method, signature);
4917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (methodID == 0) {
4927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGE("Error in getting method ID");
4937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        return;
4947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
4957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
4967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->CallStaticVoidMethodV(cls, methodID, params);
4977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (mEnv->ExceptionCheck()) {
4987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv->ExceptionDescribe();
4997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv->ExceptionClear();
5007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
5017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    va_end(params);
5037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejboolean JNIHelper::callStaticMethod(jclass cls, const char *method, const char *signature, ...)
5067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
5077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    va_list params;
5087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    va_start(params, signature);
5097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jmethodID methodID = mEnv->GetStaticMethodID(cls, method, signature);
5117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (methodID == 0) {
5127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        ALOGE("Error in getting method ID");
5137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return false;
5147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
5157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jboolean result = mEnv->CallStaticBooleanMethodV(cls, methodID, params);
5177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (mEnv->ExceptionCheck()) {
5187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv->ExceptionDescribe();
5197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mEnv->ExceptionClear();
5207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return false;
521127f7244183786e6ccae09e81eeccdac31973e69xinhe    }
5227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    va_end(params);
5247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return result;
5257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
5267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
5277d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobject> JNIHelper::createObject(const char *className)
5287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde{
5297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->FindClass(className));
5307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    if (cls == NULL) {
53183a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in finding class %s", className);
5327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobject>(*this, NULL);
5337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
5347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
5357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jmethodID constructor = mEnv->GetMethodID(cls, "<init>", "()V");
5367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (constructor == 0) {
53783a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in constructor ID for %s", className);
5387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobject>(*this, NULL);
5397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
5407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> obj(*this, mEnv->NewObject(cls, constructor));
542127f7244183786e6ccae09e81eeccdac31973e69xinhe    if (obj == NULL) {
5437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde        ALOGE("Could not create new object of %s", className);
5447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobject>(*this, NULL);
5457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
5467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
5477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    return obj;
5487f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
5497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
5507d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobjectArray> JNIHelper::createObjectArray(const char *className, int num)
55183a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande{
5527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->FindClass(className));
55383a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    if (cls == NULL) {
55483a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in finding class %s", className);
5557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobjectArray>(*this, NULL);
55683a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    }
55783a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
5587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> array(*this, mEnv->NewObjectArray(num, cls.get(), NULL));
5597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (array.get() == NULL) {
56083a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        ALOGE("Error in creating array of class %s", className);
5617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobjectArray>(*this, NULL);
56283a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande    }
56383a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
5647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jobjectArray>(*this, (jobjectArray)array.detach());
5657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5677d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobject> JNIHelper::getObjectArrayElement(jobjectArray array, int index)
5687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
5697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jobject>(*this, mEnv->GetObjectArrayElement(array, index));
5707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5727d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobject> JNIHelper::getObjectArrayElement(jobject array, int index)
5737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
5747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return getObjectArrayElement((jobjectArray)array, index);
5757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeint JNIHelper::getArrayLength(jarray array) {
5787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mEnv->GetArrayLength(array);
5797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5817d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jobjectArray> JNIHelper::newObjectArray(int num, const char *className, jobject val) {
5827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jclass> cls(*this, mEnv->FindClass(className));
5837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (cls == NULL) {
5847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        ALOGE("Error in finding class %s", className);
5857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return JNIObject<jobjectArray>(*this, NULL);
5867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
5877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jobjectArray>(*this, mEnv->NewObjectArray(num, cls, val));
5897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5917d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jbyteArray> JNIHelper::newByteArray(int num) {
5927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jbyteArray>(*this, mEnv->NewByteArray(num));
5937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5957d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jintArray> JNIHelper::newIntArray(int num) {
5967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jintArray>(*this, mEnv->NewIntArray(num));
5977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
5987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
5997d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jlongArray> JNIHelper::newLongArray(int num) {
6007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jlongArray>(*this, mEnv->NewLongArray(num));
6017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
6027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
6037d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<jstring> JNIHelper::newStringUTF(const char *utf) {
6047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return JNIObject<jstring>(*this, mEnv->NewStringUTF(utf));
6057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
6067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
6077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setObjectArrayElement(jobjectArray array, int index, jobject obj) {
6087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetObjectArrayElement(array, index, obj);
6097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
6107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
6117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setByteArrayRegion(jbyteArray array, int from, int to, jbyte *bytes) {
6127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetByteArrayRegion(array, from, to, bytes);
6137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
6147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
6157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setIntArrayRegion(jintArray array, int from, int to, jint *ints) {
6167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetIntArrayRegion(array, from, to, ints);
6177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
6187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
6197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIHelper::setLongArrayRegion(jlongArray array, int from, int to, jlong *longs) {
6207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mEnv->SetLongArrayRegion(array, from, to, longs);
62183a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande}
62283a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
6237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}; // namespace android
6247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
6257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
626