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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #define LOG_TAG "ObjectOutputStream"
21 #include "JniConstants.h"
22 #include "ScopedUtfChars.h"
24 #define GETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_GETTER_FUNCTION) \
25 static JNI_C_TYPE FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, jclass declaringClass, \
26 jstring javaFieldName) { \
27 if (instance == NULL) { \
28 return JNI_C_TYPE(); \
30 ScopedUtfChars fieldName(env, javaFieldName); \
31 if (fieldName.c_str() == NULL) { \
32 return JNI_C_TYPE(); \
34 jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \
36 return JNI_C_TYPE(); \
38 return env->JNI_GETTER_FUNCTION(instance, fid); \
41 GETTER(ObjectOutputStream_getFieldBool, jboolean, "Z", GetBooleanField)
42 GETTER(ObjectOutputStream_getFieldByte, jbyte, "B", GetByteField)
43 GETTER(ObjectOutputStream_getFieldChar, jchar, "C", GetCharField)
44 GETTER(ObjectOutputStream_getFieldDouble, jdouble, "D", GetDoubleField)
45 GETTER(ObjectOutputStream_getFieldFloat, jfloat, "F", GetFloatField)
46 GETTER(ObjectOutputStream_getFieldInt, jint, "I", GetIntField)
47 GETTER(ObjectOutputStream_getFieldLong, jlong, "J", GetLongField)
48 GETTER(ObjectOutputStream_getFieldShort, jshort, "S", GetShortField)
50 static jobject ObjectOutputStream_getFieldObj(JNIEnv* env, jclass, jobject instance,
51 jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName) {
52 ScopedUtfChars fieldName(env, javaFieldName);
53 if (fieldName.c_str() == NULL) {
56 ScopedUtfChars fieldTypeName(env, javaFieldTypeName);
57 if (fieldTypeName.c_str() == NULL) {
60 jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str());
64 return env->GetObjectField(instance, fid);
67 static JNINativeMethod gMethods[] = {
68 NATIVE_METHOD(ObjectOutputStream, getFieldBool, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z"),
69 NATIVE_METHOD(ObjectOutputStream, getFieldByte, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B"),
70 NATIVE_METHOD(ObjectOutputStream, getFieldChar, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C"),
71 NATIVE_METHOD(ObjectOutputStream, getFieldDouble, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D"),
72 NATIVE_METHOD(ObjectOutputStream, getFieldFloat, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F"),
73 NATIVE_METHOD(ObjectOutputStream, getFieldInt, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I"),
74 NATIVE_METHOD(ObjectOutputStream, getFieldLong, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J"),
75 NATIVE_METHOD(ObjectOutputStream, getFieldObj, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"),
76 NATIVE_METHOD(ObjectOutputStream, getFieldShort, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S"),
78 int register_java_io_ObjectOutputStream(JNIEnv* env) {
79 return jniRegisterNativeMethods(env, "java/io/ObjectOutputStream", gMethods, NELEM(gMethods));