1ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom/*
2ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Copyright (C) 2013 The Android Open Source Project
3ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *
4ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
5ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * you may not use this file except in compliance with the License.
6ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * You may obtain a copy of the License at
7ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *
8ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
9ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *
10ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Unless required by applicable law or agreed to in writing, software
11ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
12ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * See the License for the specific language governing permissions and
14ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * limitations under the License.
15ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom */
16ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
17ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#include <assert.h>
18ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#include <stdio.h>
19ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#include <pthread.h>
20ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath#include <vector>
21ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
22ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#include "jni.h"
23ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
24ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#if defined(NDEBUG)
25ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#error test code compiled without NDEBUG
26ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom#endif
27ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
28ce88853ab316c70ef7b598978a3609611db60552Brian Carlstromstatic JavaVM* jvm = NULL;
29ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
30ce88853ab316c70ef7b598978a3609611db60552Brian Carlstromextern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) {
3161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(vm != nullptr);
3261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(jvm == nullptr);
33ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  jvm = vm;
34ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  return JNI_VERSION_1_6;
35ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom}
36ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
3761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampestatic void* AttachHelper(void* arg) {
3861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(jvm != nullptr);
39ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
4061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  JNIEnv* env = nullptr;
41ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  JavaVMAttachArgs args = { JNI_VERSION_1_6, __FUNCTION__, NULL };
42ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  int attach_result = jvm->AttachCurrentThread(&env, &args);
43ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  assert(attach_result == 0);
44ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
4561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  typedef void (*Fn)(JNIEnv*);
4661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  Fn fn = reinterpret_cast<Fn>(arg);
4761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  fn(env);
48ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
49ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  int detach_result = jvm->DetachCurrentThread();
50ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  assert(detach_result == 0);
5161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  return nullptr;
52ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom}
53ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
5461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampestatic void PthreadHelper(void (*fn)(JNIEnv*)) {
55ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  pthread_t pthread;
5661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  int pthread_create_result = pthread_create(&pthread, nullptr, AttachHelper,
5761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                             reinterpret_cast<void*>(fn));
58ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  assert(pthread_create_result == 0);
5961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  int pthread_join_result = pthread_join(pthread, nullptr);
60ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom  assert(pthread_join_result == 0);
61ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom}
6267fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
6361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampestatic void testFindClassOnAttachedNativeThread(JNIEnv* env) {
6461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  jclass clazz = env->FindClass("Main");
6561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(clazz != nullptr);
6661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(!env->ExceptionCheck());
6762509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
6861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  jobjectArray array = env->NewObjectArray(0, clazz, nullptr);
6961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(array != nullptr);
7061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(!env->ExceptionCheck());
7161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe}
7262509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
7361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe// http://b/10994325
7461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampeextern "C" JNIEXPORT void JNICALL Java_Main_testFindClassOnAttachedNativeThread(JNIEnv*, jclass) {
7561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  PthreadHelper(&testFindClassOnAttachedNativeThread);
7661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe}
7761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
7861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampestatic void testFindFieldOnAttachedNativeThread(JNIEnv* env) {
791c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe  jclass clazz = env->FindClass("Main");
8061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(clazz != nullptr);
8162509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao  assert(!env->ExceptionCheck());
8262509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
8362509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao  jfieldID field = env->GetStaticFieldID(clazz, "testFindFieldOnAttachedNativeThreadField", "Z");
8461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(field != nullptr);
8562509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao  assert(!env->ExceptionCheck());
8662509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
8762509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao  env->SetStaticBooleanField(clazz, field, JNI_TRUE);
8862509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao}
8962509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
901c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" JNIEXPORT void JNICALL Java_Main_testFindFieldOnAttachedNativeThreadNative(JNIEnv*,
9161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                                                      jclass) {
9261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  PthreadHelper(&testFindFieldOnAttachedNativeThread);
9362509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao}
9462509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
9561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampestatic void testReflectFieldGetFromAttachedNativeThread(JNIEnv* env) {
961c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe  jclass clazz = env->FindClass("Main");
9761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(clazz != nullptr);
983bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
993bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1003bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jclass class_clazz = env->FindClass("java/lang/Class");
10161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(class_clazz != nullptr);
1023bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1033bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1043bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jmethodID getFieldMetodId = env->GetMethodID(class_clazz, "getField",
1053bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko                                               "(Ljava/lang/String;)Ljava/lang/reflect/Field;");
10661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(getFieldMetodId != nullptr);
1073bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1083bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1093bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jstring field_name = env->NewStringUTF("testReflectFieldGetFromAttachedNativeThreadField");
11061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(field_name != nullptr);
1113bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1123bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1133bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jobject field = env->CallObjectMethod(clazz, getFieldMetodId, field_name);
11461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(field != nullptr);
1153bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1163bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1173bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jclass field_clazz = env->FindClass("java/lang/reflect/Field");
11861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(field_clazz != nullptr);
1193bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1203bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1213bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jmethodID getBooleanMetodId = env->GetMethodID(field_clazz, "getBoolean",
1223bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko                                                 "(Ljava/lang/Object;)Z");
12361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(getBooleanMetodId != nullptr);
1243bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1253bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1263bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  jboolean value = env->CallBooleanMethod(field, getBooleanMetodId, /* ignored */ clazz);
1273bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(value == false);
1283bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko  assert(!env->ExceptionCheck());
1293bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko}
1303bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
1313bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko// http://b/15539150
1321c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" JNIEXPORT void JNICALL Java_Main_testReflectFieldGetFromAttachedNativeThreadNative(
1333bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko    JNIEnv*, jclass) {
13461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  PthreadHelper(&testReflectFieldGetFromAttachedNativeThread);
1353bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko}
1363bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
13762509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
13867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom// http://b/11243757
1391c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" JNIEXPORT void JNICALL Java_Main_testCallStaticVoidMethodOnSubClassNative(JNIEnv* env,
14061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                                                     jclass) {
1411c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe  jclass super_class = env->FindClass("Main$testCallStaticVoidMethodOnSubClass_SuperClass");
14261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(super_class != nullptr);
14367fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
14467fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom  jmethodID execute = env->GetStaticMethodID(super_class, "execute", "()V");
14561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(execute != nullptr);
14667fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
1471c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe  jclass sub_class = env->FindClass("Main$testCallStaticVoidMethodOnSubClass_SubClass");
14861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(sub_class != nullptr);
14967fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
15067fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom  env->CallStaticVoidMethod(sub_class, execute);
15167fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom}
152201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao
1531c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" JNIEXPORT jobject JNICALL Java_Main_testGetMirandaMethodNative(JNIEnv* env, jclass) {
1541c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe  jclass abstract_class = env->FindClass("Main$testGetMirandaMethod_MirandaAbstract");
15561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(abstract_class != nullptr);
156201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao  jmethodID miranda_method = env->GetMethodID(abstract_class, "inInterface", "()Z");
15761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(miranda_method != nullptr);
158201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao  return env->ToReflectedMethod(abstract_class, miranda_method, JNI_FALSE);
159201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao}
160ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath
161ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath// https://code.google.com/p/android/issues/detail?id=63055
1621c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" void JNICALL Java_Main_testZeroLengthByteBuffers(JNIEnv* env, jclass) {
163ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath  std::vector<uint8_t> buffer(1);
164ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath  jobject byte_buffer = env->NewDirectByteBuffer(&buffer[0], 0);
16561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  assert(byte_buffer != nullptr);
166ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath  assert(!env->ExceptionCheck());
167ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath
168ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath  assert(env->GetDirectBufferAddress(byte_buffer) == &buffer[0]);
169ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath  assert(env->GetDirectBufferCapacity(byte_buffer) == 0);
170ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath}
171d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
172d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampeconstexpr size_t kByteReturnSize = 7;
173d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampejbyte byte_returns[kByteReturnSize] = { 0, 1, 2, 127, -1, -2, -128 };
174d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
1751c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" jbyte JNICALL Java_Main_byteMethod(JNIEnv* env, jclass klass, jbyte b1, jbyte b2,
17661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                              jbyte b3, jbyte b4, jbyte b5, jbyte b6,
17761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                              jbyte b7, jbyte b8, jbyte b9, jbyte b10) {
178d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  // We use b1 to drive the output.
179d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b2 == 2);
180d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b3 == -3);
181d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b4 == 4);
182d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b5 == -5);
183d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b6 == 6);
184d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b7 == -7);
185d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b8 == 8);
186d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b9 == -9);
187d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b10 == 10);
188d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
189d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(0 <= b1);
190d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b1 < static_cast<jbyte>(kByteReturnSize));
191d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
192d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  return byte_returns[b1];
193d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe}
194d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
195d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampeconstexpr size_t kShortReturnSize = 9;
196d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampejshort short_returns[kShortReturnSize] = { 0, 1, 2, 127, 32767, -1, -2, -128,
197d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    static_cast<jshort>(0x8000) };
198d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe// The weird static_cast is because short int is only guaranteed down to -32767, not Java's -32768.
199d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
2001c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" jshort JNICALL Java_Main_shortMethod(JNIEnv* env, jclass klass, jshort s1, jshort s2,
20161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                jshort s3, jshort s4, jshort s5, jshort s6,
20261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                jshort s7, jshort s8, jshort s9, jshort s10) {
203d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  // We use s1 to drive the output.
204d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s2 == 2);
205d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s3 == -3);
206d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s4 == 4);
207d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s5 == -5);
208d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s6 == 6);
209d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s7 == -7);
210d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s8 == 8);
211d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s9 == -9);
212d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s10 == 10);
213d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
214d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(0 <= s1);
215d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(s1 < static_cast<jshort>(kShortReturnSize));
216d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
217d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  return short_returns[s1];
218d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe}
219d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
2201c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" jboolean JNICALL Java_Main_booleanMethod(JNIEnv* env, jclass klass, jboolean b1,
22161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                    jboolean b2, jboolean b3, jboolean b4,
22261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                    jboolean b5, jboolean b6, jboolean b7,
22361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                    jboolean b8, jboolean b9, jboolean b10) {
224d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  // We use b1 to drive the output.
225d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b2 == JNI_TRUE);
226d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b3 == JNI_FALSE);
227d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b4 == JNI_TRUE);
228d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b5 == JNI_FALSE);
229d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b6 == JNI_TRUE);
230d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b7 == JNI_FALSE);
231d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b8 == JNI_TRUE);
232d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b9 == JNI_FALSE);
233d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b10 == JNI_TRUE);
234d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
235d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(b1 == JNI_TRUE || b1 == JNI_FALSE);
236d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  return b1;
237d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe}
238d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
239d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampeconstexpr size_t kCharReturnSize = 8;
240d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampejchar char_returns[kCharReturnSize] = { 0, 1, 2, 127, 255, 256, 15000, 34000 };
241d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
2421c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeextern "C" jchar JNICALL Java_Main_charMethod(JNIEnv* env, jclass klacc, jchar c1, jchar c2,
24361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                              jchar c3, jchar c4, jchar c5, jchar c6, jchar c7,
24461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                              jchar c8, jchar c9, jchar c10) {
245d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  // We use c1 to drive the output.
246d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c2 == 'a');
247d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c3 == 'b');
248d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c4 == 'c');
249d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c5 == '0');
250d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c6 == '1');
251d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c7 == '2');
252d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c8 == 1234);
253d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c9 == 2345);
254d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c10 == 3456);
255d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
256d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  assert(c1 < static_cast<jchar>(kCharReturnSize));
257d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
258d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  return char_returns[c1];
259d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe}
2601268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath
2611268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamathextern "C" JNIEXPORT jboolean JNICALL Java_Main_nativeIsAssignableFrom(JNIEnv* env, jclass,
2621268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath                                                                       jclass from, jclass to) {
2631268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath  return env->IsAssignableFrom(from, to);
2641268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath}
26561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
26661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampestatic void testShallowGetCallingClassLoader(JNIEnv* env) {
26761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  // Test direct call.
26861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  {
26961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    jclass vmstack_clazz = env->FindClass("dalvik/system/VMStack");
27061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(vmstack_clazz != nullptr);
27161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(!env->ExceptionCheck());
27261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
27361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    jmethodID getCallingClassLoaderMethodId = env->GetStaticMethodID(vmstack_clazz,
27461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                                     "getCallingClassLoader",
27561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                                     "()Ljava/lang/ClassLoader;");
27661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(getCallingClassLoaderMethodId != nullptr);
27761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(!env->ExceptionCheck());
27861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
27961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    jobject class_loader = env->CallStaticObjectMethod(vmstack_clazz,
28061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                       getCallingClassLoaderMethodId);
28161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(class_loader == nullptr);
28261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(!env->ExceptionCheck());
28361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  }
28461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
28561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  // Test one-level call. Use System.loadLibrary().
28661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  {
28761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    jclass system_clazz = env->FindClass("java/lang/System");
28861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(system_clazz != nullptr);
28961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(!env->ExceptionCheck());
29061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
29161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    jmethodID loadLibraryMethodId = env->GetStaticMethodID(system_clazz, "loadLibrary",
29261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                           "(Ljava/lang/String;)V");
29361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(loadLibraryMethodId != nullptr);
29461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(!env->ExceptionCheck());
29561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
29661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    // Create a string object.
29761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    jobject library_string = env->NewStringUTF("arttest");
29861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(library_string != nullptr);
29961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    assert(!env->ExceptionCheck());
30061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
30161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    env->CallStaticVoidMethod(system_clazz, loadLibraryMethodId, library_string);
30261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    if (env->ExceptionCheck()) {
30361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe      // At most we expect UnsatisfiedLinkError.
30461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe      jthrowable thrown = env->ExceptionOccurred();
30561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe      env->ExceptionClear();
30661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
30761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe      jclass unsatisfied_link_error_clazz = env->FindClass("java/lang/UnsatisfiedLinkError");
30861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe      jclass thrown_class = env->GetObjectClass(thrown);
30961bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe      assert(env->IsSameObject(unsatisfied_link_error_clazz, thrown_class));
31061bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    }
31161bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  }
31261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe}
31361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
31461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe// http://b/16867274
31561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampeextern "C" JNIEXPORT void JNICALL Java_Main_nativeTestShallowGetCallingClassLoader(JNIEnv* env,
31661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe                                                                                   jclass) {
31761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe  PthreadHelper(&testShallowGetCallingClassLoader);
31861bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe}
319ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
320ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampestatic void testShallowGetStackClass2(JNIEnv* env) {
321ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  jclass vmstack_clazz = env->FindClass("dalvik/system/VMStack");
322ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  assert(vmstack_clazz != nullptr);
323ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  assert(!env->ExceptionCheck());
324ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
325ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  // Test direct call.
326ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  {
327ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    jmethodID getStackClass2MethodId = env->GetStaticMethodID(vmstack_clazz, "getStackClass2",
328ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe                                                              "()Ljava/lang/Class;");
329ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(getStackClass2MethodId != nullptr);
330ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(!env->ExceptionCheck());
331ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
332ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    jobject caller_class = env->CallStaticObjectMethod(vmstack_clazz, getStackClass2MethodId);
333ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(caller_class == nullptr);
334ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(!env->ExceptionCheck());
335ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  }
336ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
337ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  // Test one-level call. Use VMStack.getStackClass1().
338ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  {
339ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    jmethodID getStackClass1MethodId = env->GetStaticMethodID(vmstack_clazz, "getStackClass1",
340ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe                                                              "()Ljava/lang/Class;");
341ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(getStackClass1MethodId != nullptr);
342ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(!env->ExceptionCheck());
343ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
344ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    jobject caller_class = env->CallStaticObjectMethod(vmstack_clazz, getStackClass1MethodId);
345ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(caller_class == nullptr);
346ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    assert(!env->ExceptionCheck());
347ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  }
348ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
349ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  // For better testing we would need to compile against libcore and have a two-deep stack
350ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  // ourselves.
351ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe}
352ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
353ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampeextern "C" JNIEXPORT void JNICALL Java_Main_nativeTestShallowGetStackClass2(JNIEnv* env, jclass) {
354ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe  PthreadHelper(&testShallowGetStackClass2);
355ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe}
356