/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed 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 <jni.h>
#include <stdlib.h> // for abort

extern "C" jobject Java_dalvik_system_JniTest_returnThis(JNIEnv*, jobject obj) {
  return obj;
}

extern "C" jclass Java_dalvik_system_JniTest_returnClass(JNIEnv*, jclass klass) {
  return klass;
}

extern "C" jobject Java_dalvik_system_JniTest_returnObjectArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jobject o1,  jobject o2,  jobject o3,  jobject o4,  jobject o5,
    jobject o6,  jobject o7,  jobject o8,  jobject o9,  jobject o10,
    jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
    jobject o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jboolean Java_dalvik_system_JniTest_returnBooleanArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jboolean o1,  jboolean o2,  jboolean o3,  jboolean o4,  jboolean o5,
    jboolean o6,  jboolean o7,  jboolean o8,  jboolean o9,  jboolean o10,
    jboolean o11, jboolean o12, jboolean o13, jboolean o14, jboolean o15,
    jboolean o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jchar Java_dalvik_system_JniTest_returnCharArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jchar o1,  jchar o2,  jchar o3,  jchar o4,  jchar o5,
    jchar o6,  jchar o7,  jchar o8,  jchar o9,  jchar o10,
    jchar o11, jchar o12, jchar o13, jchar o14, jchar o15,
    jchar o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jbyte Java_dalvik_system_JniTest_returnByteArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jbyte o1,  jbyte o2,  jbyte o3,  jbyte o4,  jbyte o5,
    jbyte o6,  jbyte o7,  jbyte o8,  jbyte o9,  jbyte o10,
    jbyte o11, jbyte o12, jbyte o13, jbyte o14, jbyte o15,
    jbyte o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jshort Java_dalvik_system_JniTest_returnShortArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jshort o1,  jshort o2,  jshort o3,  jshort o4,  jshort o5,
    jshort o6,  jshort o7,  jshort o8,  jshort o9,  jshort o10,
    jshort o11, jshort o12, jshort o13, jshort o14, jshort o15,
    jshort o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jint Java_dalvik_system_JniTest_returnIntArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jint o1,  jint o2,  jint o3,  jint o4,  jint o5,
    jint o6,  jint o7,  jint o8,  jint o9,  jint o10,
    jint o11, jint o12, jint o13, jint o14, jint o15,
    jint o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jlong Java_dalvik_system_JniTest_returnLongArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jlong o1,  jlong o2,  jlong o3,  jlong o4,  jlong o5,
    jlong o6,  jlong o7,  jlong o8,  jlong o9,  jlong o10,
    jlong o11, jlong o12, jlong o13, jlong o14, jlong o15,
    jlong o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jfloat Java_dalvik_system_JniTest_returnFloatArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jfloat o1,  jfloat o2,  jfloat o3,  jfloat o4,  jfloat o5,
    jfloat o6,  jfloat o7,  jfloat o8,  jfloat o9,  jfloat o10,
    jfloat o11, jfloat o12, jfloat o13, jfloat o14, jfloat o15,
    jfloat o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jdouble Java_dalvik_system_JniTest_returnDoubleArgFrom16(
    JNIEnv*, jobject, int arg_no,
    jdouble o1,  jdouble o2,  jdouble o3,  jdouble o4,  jdouble o5,
    jdouble o6,  jdouble o7,  jdouble o8,  jdouble o9,  jdouble o10,
    jdouble o11, jdouble o12, jdouble o13, jdouble o14, jdouble o15,
    jdouble o16) {
  switch(arg_no){
  case 0:  return o1;
  case 1:  return o2;
  case 2:  return o3;
  case 3:  return o4;
  case 4:  return o5;
  case 5:  return o6;
  case 6:  return o7;
  case 7:  return o8;
  case 8:  return o9;
  case 9:  return o10;
  case 10: return o11;
  case 11: return o12;
  case 12: return o13;
  case 13: return o14;
  case 14: return o15;
  case 15: return o16;
  default: abort();
  }
}

extern "C" jclass Java_dalvik_system_JniTest_envGetSuperclass(
    JNIEnv* env, jobject, jclass clazz) {
  return env->GetSuperclass(clazz);
}
