blob: e465bc2b512f618f394978bbf9c4dbd2cbd85b3c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "JNIHelp.h"
#include "AndroidSystemNatives.h"
static jlong java_getFieldLong(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "J");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jlong) 0L;
} else {
return (*env)->GetLongField (env, targetObject, fid);
}
}
static jshort java_getFieldShort(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "S");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jshort) 0;
} else {
return (*env)->GetShortField (env, targetObject, fid);
}
}
static jdouble java_getFieldDouble(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "D");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jdouble) 0.0;
} else {
return (*env)->GetDoubleField (env, targetObject, fid);
}
}
static jboolean java_getFieldBool(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "Z");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jboolean) 0;
} else {
return (*env)->GetBooleanField (env, targetObject, fid);
}
}
static jbyte java_getFieldByte(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "B");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jbyte) 0;
} else {
return (*env)->GetByteField (env, targetObject, fid);
}
}
static jfloat java_getFieldFloat(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "F");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jfloat) 0.0f;
}
else {
return (*env)->GetFloatField (env, targetObject, fid);
}
}
static jchar java_getFieldChar(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "C");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jchar) 0;
} else {
return (*env)->GetCharField(env, targetObject, fid);
}
}
static jobject java_getFieldObj(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName,
jstring fieldTypeName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
const char *fieldTypeNameInC =
(*env)->GetStringUTFChars(env, fieldTypeName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass,
fieldNameInC, fieldTypeNameInC);
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
(*env)->ReleaseStringUTFChars(env, fieldTypeName, fieldTypeNameInC);
/*
* Two options now. Maybe getFieldID caused an exception,
* or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jobject) 0;
} else {
return (*env)->GetObjectField (env, targetObject, fid);
}
}
static jint java_getFieldInt(JNIEnv * env, jclass clazz,
jobject targetObject,
jclass declaringClass,
jstring fieldName) {
const char *fieldNameInC = (*env)->GetStringUTFChars(env, fieldName, NULL);
jfieldID fid = (*env)->GetFieldID(env, declaringClass, fieldNameInC, "I");
(*env)->ReleaseStringUTFChars(env, fieldName, fieldNameInC);
/*
* Two options now. Maybe getFieldID caused
* an exception, or maybe it returned the real value
*/
if(fid == 0) {
// Field not found. I believe we must throw an exception here
return (jint) 0;
} else {
return (*env)->GetIntField(env, targetObject, fid);
}
}
/*
* JNI registration
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "getFieldLong",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J",
(void*) java_getFieldLong },
{ "getFieldShort",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S",
(void*) java_getFieldShort },
{ "getFieldDouble",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D",
(void*) java_getFieldDouble },
{ "getFieldBool",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z",
(void*) java_getFieldBool },
{ "getFieldByte",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B",
(void*) java_getFieldByte },
{ "getFieldFloat",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F",
(void*) java_getFieldFloat },
{ "getFieldChar",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C",
(void*) java_getFieldChar },
{ "getFieldObj",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;",
(void*) java_getFieldObj },
{ "getFieldInt",
"(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I",
(void*) java_getFieldInt },
};
int register_java_io_ObjectOutputStream(JNIEnv* env) {
return jniRegisterNativeMethods(env, "java/io/ObjectOutputStream",
gMethods, NELEM(gMethods));
}