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