Home | History | Annotate | Download | only in native
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 #define LOG_TAG "ObjectInputStream"
     19 
     20 #include "JNIHelp.h"
     21 #include "JniConstants.h"
     22 #include "ScopedUtfChars.h"
     23 
     24 #define SETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_SETTER_FUNCTION) \
     25     static void FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, \
     26             jclass declaringClass, jstring javaFieldName, JNI_C_TYPE newValue) { \
     27         if (instance == NULL) { \
     28             return; \
     29         } \
     30         ScopedUtfChars fieldName(env, javaFieldName); \
     31         if (fieldName.c_str() == NULL) { \
     32             return; \
     33         } \
     34         jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \
     35         if (fid != 0) { \
     36             env->JNI_SETTER_FUNCTION(instance, fid, newValue); \
     37         } \
     38     }
     39 
     40 SETTER(ObjectInputStream_setFieldBool,   jboolean, "Z", SetBooleanField)
     41 SETTER(ObjectInputStream_setFieldByte,   jbyte,    "B", SetByteField)
     42 SETTER(ObjectInputStream_setFieldChar,   jchar,    "C", SetCharField)
     43 SETTER(ObjectInputStream_setFieldDouble, jdouble,  "D", SetDoubleField)
     44 SETTER(ObjectInputStream_setFieldFloat,  jfloat,   "F", SetFloatField)
     45 SETTER(ObjectInputStream_setFieldInt,    jint,     "I", SetIntField)
     46 SETTER(ObjectInputStream_setFieldLong,   jlong,    "J", SetLongField)
     47 SETTER(ObjectInputStream_setFieldShort,  jshort,   "S", SetShortField)
     48 
     49 static void ObjectInputStream_setFieldObject(JNIEnv* env, jclass, jobject instance,
     50         jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName, jobject newValue) {
     51     if (instance == NULL) {
     52         return;
     53     }
     54     ScopedUtfChars fieldName(env, javaFieldName);
     55     if (fieldName.c_str() == NULL) {
     56         return;
     57     }
     58     ScopedUtfChars fieldTypeName(env, javaFieldTypeName);
     59     if (fieldTypeName.c_str() == NULL) {
     60         return;
     61     }
     62     jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str());
     63     if (fid != 0) {
     64         env->SetObjectField(instance, fid, newValue);
     65     }
     66 }
     67 
     68 static jobject ObjectInputStream_newInstance(JNIEnv* env, jclass,
     69         jclass instantiationClass, jclass constructorClass) {
     70     jmethodID mid = env->GetMethodID(constructorClass, "<init>", "()V");
     71     if (mid == 0) {
     72         return NULL;
     73     }
     74     return env->NewObject(instantiationClass, mid);
     75 }
     76 
     77 static JNINativeMethod gMethods[] = {
     78     NATIVE_METHOD(ObjectInputStream, newInstance, "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;"),
     79     NATIVE_METHOD(ObjectInputStream, setFieldObject, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V"),
     80     NATIVE_METHOD(ObjectInputStream, setFieldByte, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;B)V"),
     81     NATIVE_METHOD(ObjectInputStream, setFieldChar, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;C)V"),
     82     NATIVE_METHOD(ObjectInputStream, setFieldDouble, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;D)V"),
     83     NATIVE_METHOD(ObjectInputStream, setFieldFloat, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;F)V"),
     84     NATIVE_METHOD(ObjectInputStream, setFieldInt, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;I)V"),
     85     NATIVE_METHOD(ObjectInputStream, setFieldLong, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;J)V"),
     86     NATIVE_METHOD(ObjectInputStream, setFieldShort, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;S)V"),
     87     NATIVE_METHOD(ObjectInputStream, setFieldBool, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Z)V"),
     88 };
     89 int register_java_io_ObjectInputStream(JNIEnv* env) {
     90     return jniRegisterNativeMethods(env, "java/io/ObjectInputStream", gMethods, NELEM(gMethods));
     91 }
     92