12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory> 18700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers 1954accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray#include <math.h> 2054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 21e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "art_method-inl.h" 22578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "class_linker.h" 23a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_compiler_test.h" 24578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_file.h" 2590a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes#include "gtest/gtest.h" 26cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers#include "indirect_reference_table.h" 27cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers#include "jni_internal.h" 28db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom#include "mem_map.h" 294f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "mirror/class-inl.h" 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class_loader.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 3204d7aa92bc5548bc4d272b9480614f06248194ccIan Rogers#include "mirror/object-inl.h" 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/stack_trace_element.h" 342041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov#include "nativeloader/native_loader.h" 35578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "runtime.h" 3600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers#include "ScopedLocalRef.h" 3700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers#include "scoped_thread_state_change.h" 38578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "thread.h" 39b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 40b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesextern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) { 41b9cc1ca34adec5e9254f78e9ee40d57348aa2fd0Brian Carlstrom return count + 1; 42b9cc1ca34adec5e9254f78e9ee40d57348aa2fd0Brian Carlstrom} 43b9cc1ca34adec5e9254f78e9ee40d57348aa2fd0Brian Carlstrom 44b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesextern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) { 451cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers return count + 1; 461cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers} 471cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers 48b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersnamespace art { 49b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 50a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass JniCompilerTest : public CommonCompilerTest { 51b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers protected: 526e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void SetUp() OVERRIDE { 536e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe CommonCompilerTest::SetUp(); 546e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe check_generic_jni_ = false; 556e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe } 566e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 572041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov void TearDown() OVERRIDE { 582041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov android::ResetNativeLoader(); 592041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov CommonCompilerTest::TearDown(); 602041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov } 612041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov 626e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void SetCheckGenericJni(bool generic) { 636e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe check_generic_jni_ = generic; 646e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe } 656e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 6600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void CompileForTest(jobject class_loader, bool direct, 676e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe const char* method_name, const char* method_sig) { 6800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 69eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier StackHandleScope<1> hs(soa.Self()); 70eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier Handle<mirror::ClassLoader> loader( 71eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader))); 7225c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // Compile the native method before starting the runtime 739837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader); 74e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier const auto pointer_size = class_linker_->GetImagePointerSize(); 75e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) : 76e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier c->FindVirtualMethod(method_name, method_sig, pointer_size); 77cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig; 786e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe if (check_generic_jni_) { 796f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub()); 8054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray } else { 816f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers const void* code = method->GetEntryPointFromQuickCompiledCode(); 826f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) { 8354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray CompileMethod(method); 8454accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr) 8554accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray << method_name << " " << method_sig; 8654accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray } 8725c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom } 8825c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom } 8925c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom 9000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void SetUpForTest(bool direct, const char* method_name, const char* method_sig, 916e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void* native_fnptr) { 9200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Initialize class loader and compile method when runtime not started. 932ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom if (!runtime_->IsStarted()) { 9400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers { 9500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 9600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers class_loader_ = LoadDex("MyClassNatives"); 9700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 986e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe CompileForTest(class_loader_, direct, method_name, method_sig); 9900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Start runtime. 10000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Thread::Current()->TransitionFromSuspendedToRunnable(); 1012041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov android::InitializeNativeLoader(); 1022b86767c9d05d46a2cc8f2bcf1ded44cd6262ef0Dimitry Ivanov bool started = runtime_->Start(); 103bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom CHECK(started); 10425c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom } 10500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // JNI operations after runtime start. 10625c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom env_ = Thread::Current()->GetJniEnv(); 1072041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov library_search_path_ = env_->NewStringUTF(""); 108b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes jklass_ = env_->FindClass("MyClassNatives"); 109cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig; 110cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 111cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers if (direct) { 112cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig); 113cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers } else { 114cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig); 115cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers } 116cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig; 117cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 118cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe if (native_fnptr != nullptr) { 119b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } }; 120fc7120c0293b96218d55abee29882f101acbc79bBrian Carlstrom ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1)) 121fc7120c0293b96218d55abee29882f101acbc79bBrian Carlstrom << method_name << " " << method_sig; 122bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers } else { 123bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers env_->UnregisterNatives(jklass_); 12431384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao } 125cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 126cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V"); 127cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jobj_ = env_->NewObject(jklass_, constructor); 128cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig; 129b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 130b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 131cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers public: 132cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers static jclass jklass_; 133cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers static jobject jobj_; 13400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers static jobject class_loader_; 13500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 136cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers protected: 1376e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe // We have to list the methods here so we can share them between default and generic JNI. 1386e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunNoArgMethodImpl(); 1396e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunIntMethodThroughStubImpl(); 1406e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunStaticIntMethodThroughStubImpl(); 1416e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunIntMethodImpl(); 1426e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunIntIntMethodImpl(); 1436e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunLongLongMethodImpl(); 1446e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunDoubleDoubleMethodImpl(); 1456e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRun_fooJJ_synchronizedImpl(); 1466e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunIntObjectObjectMethodImpl(); 1476e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunStaticIntIntMethodImpl(); 1486e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunStaticDoubleDoubleMethodImpl(); 1496e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void RunStaticLogDoubleMethodImpl(); 1506e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void RunStaticLogFloatMethodImpl(); 1516e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void RunStaticReturnTrueImpl(); 1526e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void RunStaticReturnFalseImpl(); 1536e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void RunGenericStaticReturnIntImpl(); 1546e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunStaticIntObjectObjectMethodImpl(); 1556e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl(); 1566e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void ExceptionHandlingImpl(); 1576e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void NativeStackTraceElementImpl(); 1586e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void ReturnGlobalRefImpl(); 1596e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void LocalReferenceTableClearingTestImpl(); 1606e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void JavaLangSystemArrayCopyImpl(); 1616e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompareAndSwapIntImpl(); 1626e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void GetTextImpl(); 1636e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void GetSinkPropertiesNativeImpl(); 1646e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void UpcallReturnTypeChecking_InstanceImpl(); 1656e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void UpcallReturnTypeChecking_StaticImpl(); 1666e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void UpcallArgumentTypeChecking_InstanceImpl(); 1676e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void UpcallArgumentTypeChecking_StaticImpl(); 1686e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CompileAndRunFloatFloatMethodImpl(); 1696e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void CheckParameterAlignImpl(); 1706e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void MaxParamNumberImpl(); 1716e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void WithoutImplementationImpl(); 17248ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe void WithoutImplementationRefReturnImpl(); 1736e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void StackArgsIntsFirstImpl(); 1746e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void StackArgsFloatsFirstImpl(); 1756e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe void StackArgsMixedImpl(); 176f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic void StackArgsSignExtendedMips64Impl(); 1776e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 178cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers JNIEnv* env_; 1792041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov jstring library_search_path_; 180cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jmethodID jmethod_; 1816e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe bool check_generic_jni_; 182b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}; 183b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 184cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogersjclass JniCompilerTest::jklass_; 185cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogersjobject JniCompilerTest::jobj_; 18600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersjobject JniCompilerTest::class_loader_; 187cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 1886e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe#define JNI_TEST(TestName) \ 1896e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe TEST_F(JniCompilerTest, TestName ## Default) { \ 1906e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe TestName ## Impl(); \ 1916e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe } \ 1926e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe \ 1936e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe TEST_F(JniCompilerTest, TestName ## Generic) { \ 1946e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe TEST_DISABLED_FOR_MIPS(); \ 1956e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe SetCheckGenericJni(true); \ 1966e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe TestName ## Impl(); \ 1976e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe } 198cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe 199b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_foo_calls = 0; 200b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesvoid Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) { 20100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = thisObj 20250b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 20350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers Locks::mutator_lock_->AssertNotHeld(Thread::Current()); 204cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 205cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 206a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 207b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_foo_calls++; 208ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 209ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 210b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 211b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2126e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunNoArgMethodImpl() { 213ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo)); 214cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 215b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_foo_calls); 216cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_); 217b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_foo_calls); 218cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_); 219b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_foo_calls); 2206e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 2216e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_foo_calls = 0; 222cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers} 223cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 2246e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunNoArgMethod) 2256e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 2266e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() { 227cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe SetUpForTest(false, "bar", "(I)I", nullptr); 228cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe // calling through stub will link with &Java_MyClassNatives_bar 22931384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao 23031384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao std::string reason; 231f5a3099c509cf9b8a4ce9c3073a4db47e14a23bcDmitriy Ivanov ASSERT_TRUE(Runtime::Current()->GetJavaVM()-> 2322041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason)) 23368d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers << reason; 23431384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao 23531384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24); 23631384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao EXPECT_EQ(25, result); 23731384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao} 23831384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao 2396e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunIntMethodThroughStub) 2406e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 2416e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() { 242cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe SetUpForTest(true, "sbar", "(I)I", nullptr); 243cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe // calling through stub will link with &Java_MyClassNatives_sbar 2441cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers 2451cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers std::string reason; 246f5a3099c509cf9b8a4ce9c3073a4db47e14a23bcDmitriy Ivanov ASSERT_TRUE(Runtime::Current()->GetJavaVM()-> 2472041f98d807edd8afa2ef8c172ed1967472c3d9eDimitry Ivanov LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason)) 24868d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers << reason; 2491cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers 2501cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42); 2511cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers EXPECT_EQ(43, result); 2521cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers} 2531cefdbdff559aff5a3ee5c0878ba3b505109e0f9Ian Rogers 2546e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunStaticIntMethodThroughStub) 2556e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 256b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooI_calls = 0; 257b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) { 25800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = thisObj 25950b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 260cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 261cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 262a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 263b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooI_calls++; 264ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 265ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 266b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return x; 267b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 268b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2696e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunIntMethodImpl() { 27000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooI", "(I)I", 271b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooI)); 272cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 273b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls); 274cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42); 275cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(42, result); 276b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls); 277cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D); 278cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(static_cast<jint>(0xCAFED00D), result); 279b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls); 2806e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 2816e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooI_calls = 0; 282cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers} 283cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 2846e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunIntMethod) 2856e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 286b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooII_calls = 0; 287b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) { 28800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = thisObj 28950b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 290cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 291cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 292a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 293b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooII_calls++; 294ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 295ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 296b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return x - y; // non-commutative operator 297b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 298b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2996e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunIntIntMethodImpl() { 30000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooII", "(II)I", 301b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooII)); 302cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 303b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls); 304cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10); 305cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(99 - 10, result); 306b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls); 307cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE, 308cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 0xCAFED00D); 309cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result); 310b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls); 3116e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 3126e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooII_calls = 0; 313cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers} 314cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 3156e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunIntIntMethod) 3166e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 317b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooJJ_calls = 0; 318b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) { 31900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = thisObj 32050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 3219b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 322cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 3239b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 324b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooJJ_calls++; 325ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 326ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 3279b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers return x - y; // non-commutative operator 3289b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers} 3299b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers 3306e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunLongLongMethodImpl() { 33100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooJJ", "(JJ)J", 332b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ)); 3339b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers 334b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls); 3350f6784737882199197796b67b99e5f1ded383beeIan Rogers jlong a = INT64_C(0x1234567890ABCDEF); 3360f6784737882199197796b67b99e5f1ded383beeIan Rogers jlong b = INT64_C(0xFEDCBA0987654321); 3379b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b); 3389b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers EXPECT_EQ(a - b, result); 339b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls); 3409b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a); 3419b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers EXPECT_EQ(b - a, result); 342b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls); 3436e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 3446e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooJJ_calls = 0; 3459b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers} 3469b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers 3476e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunLongLongMethod) 3486e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 349b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooDD_calls = 0; 350b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) { 35100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = thisObj 35250b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 353cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 354cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 355a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 356b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooDD_calls++; 357ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 358ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 359b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return x - y; // non-commutative operator 360b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 361b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 3626e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() { 36300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooDD", "(DD)D", 364b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooDD)); 365cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 366b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls); 367cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, 368cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 99.0, 10.0); 369647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_DOUBLE_EQ(99.0 - 10.0, result); 370b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls); 371cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jdouble a = 3.14159265358979323846; 372cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers jdouble b = 0.69314718055994530942; 373cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b); 374647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_DOUBLE_EQ(a - b, result); 375b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls); 3766e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 3776e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooDD_calls = 0; 378cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers} 379cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 3803e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughesint gJava_MyClassNatives_fooJJ_synchronized_calls = 0; 3813e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughesjlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) { 38200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = thisObj 38350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 3843e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 385cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 3863e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 3873e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes gJava_MyClassNatives_fooJJ_synchronized_calls++; 388ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 389ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 3903e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes return x | y; 3913e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes} 3923e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes 3936e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() { 39400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooJJ_synchronized", "(JJ)J", 3953e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized)); 3963e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes 3973e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls); 3983e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes jlong a = 0x1000000020000000ULL; 3993e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes jlong b = 0x00ff000000aa0000ULL; 4003e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b); 4013e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes EXPECT_EQ(a | b, result); 4023e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls); 4036e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 4046e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooJJ_synchronized_calls = 0; 4053e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes} 4063e778f7ee62fe75912379531022a09230c25f5f8Elliott Hughes 4076e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRun_fooJJ_synchronized) 4086e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 409b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooIOO_calls = 0; 410b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y, 411b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers jobject z) { 41200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 3 = this + y + z 41350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 414cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 415cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 416a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 417b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooIOO_calls++; 418ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 419bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0); 420bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() || 421bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe (3U - null_args) == Thread::Current()->NumStackReferences()); 422b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers switch (x) { 423b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case 1: 424b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return y; 425b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case 2: 426b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return z; 427b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers default: 428cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers return thisObj; 429b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 430b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 431b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4326e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() { 43300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooIOO", 434cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 435b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO)); 436cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 437b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls); 438cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr); 439cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 440b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls); 441cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 442cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_); 443cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 444b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls); 445cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_); 446cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(env_->IsSameObject(nullptr, result)); 447b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls); 448cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_); 449cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 450b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls); 451cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 452cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr); 453cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 454b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls); 455cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr); 456cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 457b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls); 458cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr); 459cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(env_->IsSameObject(nullptr, result)); 460b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls); 4616e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 4626e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooIOO_calls = 0; 463cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers} 464cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 4656e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunIntObjectObjectMethod) 4666e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 467b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooSII_calls = 0; 468b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) { 46900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = klass 47050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 47182da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 472cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(klass != nullptr); 47382da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass)); 474b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooSII_calls++; 475ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 476ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 47782da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao return x + y; 47882da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao} 47982da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao 4806e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() { 48100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "fooSII", "(II)I", 482b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooSII)); 48382da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao 484b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls); 48582da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30); 48682da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao EXPECT_EQ(50, result); 487b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls); 4886e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 4896e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooSII_calls = 0; 49082da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao} 49182da44b625a1af03c0b768c71f1cef29831127c3Shih-wei Liao 4926e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunStaticIntIntMethod) 4936e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 494b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooSDD_calls = 0; 495b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) { 49600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 1 = klass 49750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 4987a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 499cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(klass != nullptr); 5007a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass)); 501b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooSDD_calls++; 502ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 503ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 5047a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers return x - y; // non-commutative operator 5057a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers} 5067a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers 5076e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() { 50800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "fooSDD", "(DD)D", 509b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD)); 5107a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers 511b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls); 5127a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0); 513647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_DOUBLE_EQ(99.0 - 10.0, result); 514b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls); 5157a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers jdouble a = 3.14159265358979323846; 5167a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers jdouble b = 0.69314718055994530942; 5177a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b); 518647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_DOUBLE_EQ(a - b, result); 519647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls); 5206e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 5216e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooSDD_calls = 0; 5227a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers} 5237a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers 5246e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunStaticDoubleDoubleMethod) 5256e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 52654accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray// The x86 generic JNI code had a bug where it assumed a floating 52754accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray// point return value would be in xmm0. We use log, to somehow ensure 52854accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray// the compiler will use the floating point stack. 52954accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5306a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersjdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) { 53154accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray return log(x); 53254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 53354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5346e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::RunStaticLogDoubleMethodImpl() { 5356e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe SetUpForTest(true, "logD", "(D)D", reinterpret_cast<void*>(&Java_MyClassNatives_logD)); 53654accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 53754accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0); 538647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_DOUBLE_EQ(log(2.0), result); 53954accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 54054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5416e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(RunStaticLogDoubleMethod) 5426e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 5436a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersjfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) { 54454accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray return logf(x); 54554accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 54654accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5476e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::RunStaticLogFloatMethodImpl() { 5486e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe SetUpForTest(true, "logF", "(F)F", reinterpret_cast<void*>(&Java_MyClassNatives_logF)); 54954accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 55054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0); 551647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_FLOAT_EQ(logf(2.0), result); 55254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 55354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5546e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(RunStaticLogFloatMethod) 5556e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 5566a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersjboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) { 55754accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray return JNI_TRUE; 55854accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 55954accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5606a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersjboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) { 56154accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray return JNI_FALSE; 56254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 56354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5646a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersjint Java_MyClassNatives_returnInt(JNIEnv*, jclass) { 56554accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray return 42; 56654accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 56754accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5686e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::RunStaticReturnTrueImpl() { 5696e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe SetUpForTest(true, "returnTrue", "()Z", reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue)); 57054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 57154accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_); 57254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray EXPECT_TRUE(result); 57354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 57454accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5756e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(RunStaticReturnTrue) 5766e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 5776e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::RunStaticReturnFalseImpl() { 57854accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray SetUpForTest(true, "returnFalse", "()Z", 5796e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse)); 58054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 58154accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_); 58254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray EXPECT_FALSE(result); 58354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 58454accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5856e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(RunStaticReturnFalse) 5866e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 5876e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::RunGenericStaticReturnIntImpl() { 5886e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe SetUpForTest(true, "returnInt", "()I", reinterpret_cast<void*>(&Java_MyClassNatives_returnInt)); 58954accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 59054accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray jint result = env_->CallStaticIntMethod(jklass_, jmethod_); 59154accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray EXPECT_EQ(42, result); 59254accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray} 59354accbca0b549b1b1ad3ef09655dad438bc1e104Nicolas Geoffray 5946e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(RunGenericStaticReturnInt) 5956e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 596b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooSIOO_calls = 0; 597b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y, 598b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers jobject z) { 59900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 3 = klass + y + z 60050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 601cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 602cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(klass != nullptr); 603a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass)); 604b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooSIOO_calls++; 605ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 606bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0); 607bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() || 608bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe (3U - null_args) == Thread::Current()->NumStackReferences()); 609b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers switch (x) { 610b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case 1: 611b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return y; 612b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case 2: 613b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return z; 614b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers default: 615b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return klass; 616b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 617b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 618b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 619cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 6206e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() { 62100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "fooSIOO", 622cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 623b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO)); 624cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 625b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls); 626cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr); 627cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 628b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls); 629cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 630cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_); 631cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 632b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls); 633cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_); 634cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(env_->IsSameObject(nullptr, result)); 635b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls); 636cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_); 637cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 638b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls); 639cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 640cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr); 641cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 642b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls); 643cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr); 644cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 645b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls); 646cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr); 647cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(env_->IsSameObject(nullptr, result)); 648b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls); 6496e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 6506e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooSIOO_calls = 0; 651cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers} 652cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 6536e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunStaticIntObjectObjectMethod) 6546e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 655b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesint gJava_MyClassNatives_fooSSIOO_calls = 0; 65600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersjobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) { 65700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // 3 = klass + y + z 65850b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers EXPECT_EQ(kNative, Thread::Current()->GetState()); 659cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 660cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(klass != nullptr); 661a8cd9f4a849835af7856f9c9782ea59e11ddef85Ian Rogers EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass)); 662b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_fooSSIOO_calls++; 663ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ScopedObjectAccess soa(Thread::Current()); 664bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0); 665bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() || 666bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe (3U - null_args) == Thread::Current()->NumStackReferences()); 667df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers switch (x) { 668df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers case 1: 669df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers return y; 670df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers case 2: 671df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers return z; 672df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers default: 673df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers return klass; 674df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers } 675df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 676df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 6776e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() { 67800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "fooSSIOO", 679cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 680b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO)); 681419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro 682b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls); 683cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr); 684cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 685b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls); 686cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 687cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_); 688cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 689b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls); 690cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_); 691cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(env_->IsSameObject(nullptr, result)); 692b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls); 693cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_); 694cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 695b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls); 696cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers 697cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr); 698cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jklass_, result)); 699b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls); 700cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr); 701cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers EXPECT_TRUE(env_->IsSameObject(jobj_, result)); 702b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls); 703cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr); 704cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(env_->IsSameObject(nullptr, result)); 705b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls); 7066e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 7076e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_fooSSIOO_calls = 0; 708df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 709df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 7106e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunStaticSynchronizedIntObjectObjectMethod) 7116e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 712b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesvoid Java_MyClassNatives_throwException(JNIEnv* env, jobject) { 713a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes jclass c = env->FindClass("java/lang/RuntimeException"); 714a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes env->ThrowNew(c, "hello"); 715a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes} 716a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 7176e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::ExceptionHandlingImpl() { 71800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers { 71900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ASSERT_FALSE(runtime_->IsStarted()); 72000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 72100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers class_loader_ = LoadDex("MyClassNatives"); 72200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 72300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // all compilation needs to happen before Runtime::Start 72400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers CompileForTest(class_loader_, false, "foo", "()V"); 72500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers CompileForTest(class_loader_, false, "throwException", "()V"); 72600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers CompileForTest(class_loader_, false, "foo", "()V"); 72700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 72800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Start runtime to avoid re-initialization in SetupForTest. 72900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Thread::Current()->TransitionFromSuspendedToRunnable(); 730bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom bool started = runtime_->Start(); 731bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom CHECK(started); 73225c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom 733b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes gJava_MyClassNatives_foo_calls = 0; 734a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 73567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Check a single call of a JNI method is ok 73600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo)); 737cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_); 738b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_foo_calls); 73967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers EXPECT_FALSE(Thread::Current()->IsExceptionPending()); 740a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 74167375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Get class for exception we expect to be thrown 74200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException")); 74300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "throwException", "()V", 744b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_throwException)); 745b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // Call Java_MyClassNatives_throwException (JNI method that throws exception) 746cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_); 747b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(1, gJava_MyClassNatives_foo_calls); 74800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE); 74900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred()); 75000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers env_->ExceptionClear(); 75100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get())); 752a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 75367375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Check a single call of a JNI method is ok 75400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo)); 755cdd1d2d3fee0711b8b11db99f2dfb80113520100Ian Rogers env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_); 756b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_EQ(2, gJava_MyClassNatives_foo_calls); 7576e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 7586e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_foo_calls = 0; 75945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 76045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 7616e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(ExceptionHandling) 7626e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 763b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) { 764ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao if (i <= 0) { 765cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe // We want to check raw Object* / Array* below 76600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 767aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers 768aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers // Build stack trace 769ee1d79a603c77c0667b27c075a983579d5c51f7eSebastien Hertz jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa); 77053b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal); 7712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::StackTraceElement>* trace_array = 7722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array); 773cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(trace_array != nullptr); 774ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao EXPECT_EQ(11, trace_array->GetLength()); 775ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao 776aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers // Check stack trace entries have expected values 777277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe for (int32_t j = 0; j < trace_array->GetLength(); ++j) { 778277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber()); 779277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe mirror::StackTraceElement* ste = trace_array->Get(j); 780aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str()); 781b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str()); 782aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str()); 783ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao } 784aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers 785aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers // end recursion 786ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao return 0; 787ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao } else { 788b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes jclass jklass = env->FindClass("MyClassNatives"); 789cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(jklass != nullptr); 790ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I"); 791cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(jmethod != nullptr); 792ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao 793aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers // Recurse with i - 1 794ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1); 795aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers 796aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers // Return sum of all depths 797ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao return i + result; 798ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao } 799ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao} 800ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao 8016e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::NativeStackTraceElementImpl() { 80200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooI", "(I)I", 803b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall)); 804ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10); 805aaa208006d7c8cc0f381c4aa9b525be24066c495Ian Rogers EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result); 806ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao} 807ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao 8086e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(NativeStackTraceElement) 8096e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 810b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) { 811558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao return env->NewGlobalRef(x); 812558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao} 813558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao 8146e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::ReturnGlobalRefImpl() { 81500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;", 816b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_fooO)); 817558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_); 818558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result)); 819558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao EXPECT_TRUE(env_->IsSameObject(result, jobj_)); 820558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao} 821558788e60554ff5c110fb90cc46ee1ecef3ec85aShih-wei Liao 8226e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(ReturnGlobalRef) 8236e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 824dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersjint local_ref_test(JNIEnv* env, jobject thisObj, jint x) { 825dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers // Add 10 local references 82600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 8275a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers for (int i = 0; i < 10; i++) { 8282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj)); 829dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers } 830dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers return x+1; 831dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 832dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 8336e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::LocalReferenceTableClearingTestImpl() { 83400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test)); 835dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers // 1000 invocations of a method that adds 10 local references 836b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes for (int i = 0; i < 1000; i++) { 837dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers jint result = env_->CallIntMethod(jobj_, jmethod_, i); 838dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers EXPECT_TRUE(result == i + 1); 839dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers } 840dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 841dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 8426e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(LocalReferenceTableClearingTest) 8436e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 844b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogersvoid my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) { 845b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass)); 846b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst)); 84782f3e09e27284056a4007a6c38fce832d877f672Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src)); 848b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers EXPECT_EQ(1234, src_pos); 849b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers EXPECT_EQ(5678, dst_pos); 850b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers EXPECT_EQ(9876, length); 851b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers} 852b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers 8536e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::JavaLangSystemArrayCopyImpl() { 85400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V", 855b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers reinterpret_cast<void*>(&my_arraycopy)); 85682f3e09e27284056a4007a6c38fce832d877f672Ian Rogers env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876); 857b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers} 858b9231c81fad1c9d85ea7e6db9120f872e3417380Ian Rogers 8596e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(JavaLangSystemArrayCopy) 8606e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 86167375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersjboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) { 86267375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe)); 86367375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj)); 8640f6784737882199197796b67b99e5f1ded383beeIan Rogers EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset); 86567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected); 86667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval); 86767375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers return JNI_TRUE; 86867375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers} 86967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers 8706e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompareAndSwapIntImpl() { 87100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", 87267375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers reinterpret_cast<void*>(&my_casi)); 8730f6784737882199197796b67b99e5f1ded383beeIan Rogers jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88), 8740f6784737882199197796b67b99e5f1ded383beeIan Rogers 0xCAFEF00D, 0xEBADF00D); 87567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers EXPECT_EQ(result, JNI_TRUE); 87667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers} 87767375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers 8786e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompareAndSwapInt) 8796e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 880c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogersjint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) { 881c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass)); 882c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1)); 883c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2)); 884c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers EXPECT_EQ(0x12345678ABCDEF88ll, val1); 885c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers EXPECT_EQ(0x7FEDCBA987654321ll, val2); 886c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers return 42; 887c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers} 888c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers 8896e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::GetTextImpl() { 89000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I", 891c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers reinterpret_cast<void*>(&my_gettext)); 892c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_, 8930f6784737882199197796b67b99e5f1ded383beeIan Rogers INT64_C(0x7FEDCBA987654321), jobj_); 894c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers EXPECT_EQ(result, 42); 895c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers} 896c77928475995d01e1d6d2b2d6672510d01a5fce4Ian Rogers 8976e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(GetText) 8986e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 8994e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Markoint gJava_MyClassNatives_GetSinkProperties_calls = 0; 9004e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Markojarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) { 9014e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko // 1 = thisObj 9024e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko Thread* self = Thread::Current(); 9034e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(kNative, self->GetState()); 9044e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko Locks::mutator_lock_->AssertNotHeld(self); 9054e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(self->GetJniEnv(), env); 9064e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_TRUE(thisObj != nullptr); 9074e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 9084e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(s, nullptr); 9094e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko gJava_MyClassNatives_GetSinkProperties_calls++; 9104e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko ScopedObjectAccess soa(self); 9114e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(2U, self->NumStackReferences()); 9124e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj))); 9134e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko return nullptr; 9144e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko} 9154e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko 9166e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::GetSinkPropertiesNativeImpl() { 9174e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;", 9184e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties)); 9194e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko 9204e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls); 9214e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko jarray result = down_cast<jarray>( 9224e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr)); 9234e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(nullptr, result); 9244e24b9da7c5ea6e517ecdbc09aa14a0995100b7eVladimir Marko EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls); 9256e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 9266e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe gJava_MyClassNatives_GetSinkProperties_calls = 0; 927fc7120c0293b96218d55abee29882f101acbc79bBrian Carlstrom} 928fc7120c0293b96218d55abee29882f101acbc79bBrian Carlstrom 9296e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(GetSinkPropertiesNative) 9306e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 931b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes// This should return jclass, but we're imitating a bug pattern. 932b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) { 933b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes return env->NewStringUTF("not a class!"); 934b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 935b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 936b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes// This should return jclass, but we're imitating a bug pattern. 937b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesjobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) { 938b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes return env->NewStringUTF("not a class!"); 939b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 940b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 9416e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() { 94200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;", 943b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass)); 944b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 945672df88dceaedcc2111e3b9aef1deb01885537a8Ian Rogers CheckJniAbortCatcher check_jni_abort_catcher; 9463f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // This native method is bad, and tries to return a jstring as a jclass. 9473f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes env_->CallObjectMethod(jobj_, jmethod_); 9483f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()"); 9493f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes 9503f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Here, we just call the method incorrectly; we should catch that too. 95168d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers env_->CallObjectMethod(jobj_, jmethod_); 9523f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()"); 95368d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers env_->CallStaticObjectMethod(jklass_, jmethod_); 95468d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV"); 955b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 956b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 9576e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(UpcallReturnTypeChecking_Instance) 9586e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 9596e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() { 96000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;", 961b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass)); 962b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 963672df88dceaedcc2111e3b9aef1deb01885537a8Ian Rogers CheckJniAbortCatcher check_jni_abort_catcher; 9643f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // This native method is bad, and tries to return a jstring as a jclass. 9653f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes env_->CallStaticObjectMethod(jklass_, jmethod_); 9663f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()"); 9673f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes 9683f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes // Here, we just call the method incorrectly; we should catch that too. 96968d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers env_->CallStaticObjectMethod(jklass_, jmethod_); 9703f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()"); 97168d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers env_->CallObjectMethod(jobj_, jmethod_); 97268d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV"); 973b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 974b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 9756e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(UpcallReturnTypeChecking_Static) 9766e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 977b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes// This should take jclass, but we're imitating a bug pattern. 978b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesvoid Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) { 979b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 980b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 981b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes// This should take jclass, but we're imitating a bug pattern. 982b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesvoid Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) { 983b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 984b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 9856e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() { 986369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe // This will lead to error messages in the log. 987369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe ScopedLogSeverity sls(LogSeverity::FATAL); 988369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe 98900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V", 990b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass)); 991b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 992b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 993b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // We deliberately pass a bad second argument here. 994b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!")); 9953f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)"); 996b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 997b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 9986e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(UpcallArgumentTypeChecking_Instance) 9996e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 10006e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() { 1001369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe // This will lead to error messages in the log. 1002369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe ScopedLogSeverity sls(LogSeverity::FATAL); 1003369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe 100400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V", 1005b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass)); 1006b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 1007b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes CheckJniAbortCatcher check_jni_abort_catcher; 1008b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes // We deliberately pass a bad second argument here. 1009b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!")); 10103f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)"); 1011b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes} 1012b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 10136e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(UpcallArgumentTypeChecking_Static) 10146e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 10157a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampejfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) { 10167a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(kNative, Thread::Current()->GetState()); 10177a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 1018cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 10197a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 10207a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe ScopedObjectAccess soa(Thread::Current()); 10217a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 10227a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe return f1 - f2; // non-commutative operator 10237a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe} 10247a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 10256e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CompileAndRunFloatFloatMethodImpl() { 10267a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe SetUpForTest(false, "checkFloats", "(FF)F", 10277a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats)); 10287a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 10297a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, 10307a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 99.0F, 10.0F); 1031647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_FLOAT_EQ(99.0F - 10.0F, result); 10327a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jfloat a = 3.14159F; 10337a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jfloat b = 0.69314F; 10347a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b); 1035647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers EXPECT_FLOAT_EQ(a - b, result); 10367a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe} 10377a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 10386e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CompileAndRunFloatFloatMethod) 10396e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 10406a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersvoid Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED, 10416a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers jobject thisObj ATTRIBUTE_UNUSED, 10426a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers jint i1 ATTRIBUTE_UNUSED, 10436a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers jlong l1 ATTRIBUTE_UNUSED) { 1044cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe// EXPECT_EQ(kNative, Thread::Current()->GetState()); 1045cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe// EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 1046cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe// EXPECT_TRUE(thisObj != nullptr); 1047cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 1048cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe// ScopedObjectAccess soa(Thread::Current()); 1049cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe// EXPECT_EQ(1U, Thread::Current()->NumStackReferences()); 10507a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(i1, 1234); 10510f6784737882199197796b67b99e5f1ded383beeIan Rogers EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0)); 10527a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe} 10537a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 10546e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::CheckParameterAlignImpl() { 10557a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe SetUpForTest(false, "checkParameterAlign", "(IJ)V", 10567a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign)); 10577a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 10580f6784737882199197796b67b99e5f1ded383beeIan Rogers env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0)); 10597a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe} 10607a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 10616e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(CheckParameterAlign) 10626e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 10637a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampevoid Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj, 10647a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7, 10657a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15, 10667a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23, 10677a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31, 10687a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39, 10697a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47, 10707a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55, 10717a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63, 10727a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71, 10737a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79, 10747a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87, 10757a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95, 10767a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103, 10777a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111, 10787a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119, 10797a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127, 10807a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135, 10817a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143, 10827a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151, 10837a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159, 10847a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167, 10857a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175, 10867a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183, 10877a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191, 10887a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199, 10897a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207, 10907a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215, 10917a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223, 10927a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231, 10937a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239, 10947a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247, 10957a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) { 10967a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(kNative, Thread::Current()->GetState()); 10977a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(Thread::Current()->GetJniEnv(), env); 1098cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe EXPECT_TRUE(thisObj != nullptr); 10997a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_)); 11007a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe ScopedObjectAccess soa(Thread::Current()); 11017a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_GE(255U, Thread::Current()->NumStackReferences()); 11027a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 11037a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe // two tests possible 11047a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe if (o0 == nullptr) { 11057a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe // 1) everything is null 11067a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr 11077a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr 11087a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr 11097a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr 11107a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr 11117a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr 11127a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr 11137a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr 11147a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr 11157a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr 11167a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr 11177a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr 11187a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr 11197a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr 11207a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr 11217a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr 11227a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr 11237a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr 11247a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr 11257a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr 11267a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr 11277a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr 11287a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr 11297a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr 11307a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr 11317a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr 11327a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr 11337a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr 11347a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr 11357a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr 11367a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr 11377a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr 11387a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr 11397a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr 11407a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr 11417a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr 11427a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr 11437a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr 11447a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr 11457a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr 11467a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr 11477a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr 11487a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr 11497a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr 11507a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr 11517a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr 11527a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr 11537a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr 11547a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr 11557a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr 11567a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr); 11577a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe } else { 11587a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0))); 11597a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1))); 11607a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2))); 11617a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3))); 11627a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4))); 11637a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5))); 11647a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6))); 11657a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7))); 11667a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8))); 11677a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9))); 11687a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10))); 11697a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11))); 11707a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12))); 11717a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13))); 11727a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14))); 11737a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15))); 11747a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16))); 11757a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17))); 11767a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18))); 11777a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19))); 11787a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20))); 11797a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21))); 11807a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22))); 11817a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23))); 11827a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24))); 11837a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25))); 11847a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26))); 11857a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27))); 11867a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28))); 11877a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29))); 11887a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30))); 11897a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31))); 11907a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32))); 11917a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33))); 11927a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34))); 11937a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35))); 11947a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36))); 11957a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37))); 11967a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38))); 11977a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39))); 11987a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40))); 11997a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41))); 12007a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42))); 12017a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43))); 12027a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44))); 12037a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45))); 12047a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46))); 12057a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47))); 12067a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48))); 12077a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49))); 12087a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50))); 12097a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51))); 12107a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52))); 12117a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53))); 12127a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54))); 12137a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55))); 12147a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56))); 12157a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57))); 12167a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58))); 12177a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59))); 12187a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60))); 12197a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61))); 12207a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62))); 12217a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63))); 12227a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64))); 12237a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65))); 12247a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66))); 12257a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67))); 12267a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68))); 12277a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69))); 12287a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70))); 12297a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71))); 12307a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72))); 12317a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73))); 12327a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74))); 12337a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75))); 12347a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76))); 12357a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77))); 12367a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78))); 12377a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79))); 12387a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80))); 12397a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81))); 12407a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82))); 12417a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83))); 12427a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84))); 12437a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85))); 12447a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86))); 12457a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87))); 12467a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88))); 12477a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89))); 12487a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90))); 12497a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91))); 12507a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92))); 12517a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93))); 12527a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94))); 12537a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95))); 12547a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96))); 12557a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97))); 12567a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98))); 12577a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99))); 12587a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100))); 12597a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101))); 12607a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102))); 12617a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103))); 12627a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104))); 12637a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105))); 12647a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106))); 12657a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107))); 12667a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108))); 12677a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109))); 12687a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110))); 12697a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111))); 12707a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112))); 12717a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113))); 12727a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114))); 12737a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115))); 12747a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116))); 12757a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117))); 12767a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118))); 12777a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119))); 12787a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120))); 12797a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121))); 12807a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122))); 12817a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123))); 12827a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124))); 12837a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125))); 12847a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126))); 12857a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127))); 12867a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128))); 12877a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129))); 12887a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130))); 12897a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131))); 12907a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132))); 12917a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133))); 12927a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134))); 12937a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135))); 12947a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136))); 12957a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137))); 12967a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138))); 12977a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139))); 12987a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140))); 12997a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141))); 13007a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142))); 13017a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143))); 13027a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144))); 13037a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145))); 13047a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146))); 13057a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147))); 13067a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148))); 13077a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149))); 13087a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150))); 13097a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151))); 13107a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152))); 13117a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153))); 13127a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154))); 13137a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155))); 13147a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156))); 13157a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157))); 13167a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158))); 13177a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159))); 13187a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160))); 13197a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161))); 13207a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162))); 13217a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163))); 13227a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164))); 13237a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165))); 13247a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166))); 13257a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167))); 13267a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168))); 13277a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169))); 13287a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170))); 13297a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171))); 13307a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172))); 13317a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173))); 13327a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174))); 13337a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175))); 13347a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176))); 13357a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177))); 13367a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178))); 13377a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179))); 13387a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180))); 13397a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181))); 13407a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182))); 13417a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183))); 13427a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184))); 13437a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185))); 13447a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186))); 13457a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187))); 13467a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188))); 13477a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189))); 13487a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190))); 13497a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191))); 13507a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192))); 13517a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193))); 13527a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194))); 13537a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195))); 13547a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196))); 13557a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197))); 13567a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198))); 13577a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199))); 13587a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200))); 13597a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201))); 13607a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202))); 13617a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203))); 13627a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204))); 13637a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205))); 13647a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206))); 13657a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207))); 13667a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208))); 13677a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209))); 13687a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210))); 13697a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211))); 13707a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212))); 13717a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213))); 13727a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214))); 13737a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215))); 13747a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216))); 13757a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217))); 13767a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218))); 13777a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219))); 13787a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220))); 13797a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221))); 13807a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222))); 13817a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223))); 13827a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224))); 13837a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225))); 13847a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226))); 13857a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227))); 13867a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228))); 13877a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229))); 13887a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230))); 13897a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231))); 13907a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232))); 13917a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233))); 13927a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234))); 13937a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235))); 13947a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236))); 13957a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237))); 13967a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238))); 13977a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239))); 13987a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240))); 13997a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241))); 14007a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242))); 14017a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243))); 14027a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244))); 14037a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245))); 14047a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246))); 14057a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247))); 14067a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248))); 14077a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249))); 14087a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250))); 14097a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251))); 14107a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252))); 14117a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253))); 14127a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe } 14137a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe} 14147a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14157a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampeconst char* longSig = 14167a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14177a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14187a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14197a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14207a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14217a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14227a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14237a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14247a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14257a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14267a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14277a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14287a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14297a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14307a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14317a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14327a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14337a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14347a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14357a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14367a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14377a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14387a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14397a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14407a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14417a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14427a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14437a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14447a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14457a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14467a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14477a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14487a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14497a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14507a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14517a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14527a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14537a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14547a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14557a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14567a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14577a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14587a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14597a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14607a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14617a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14627a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14637a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14647a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14657a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" 14667a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V"; 14677a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14686e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::MaxParamNumberImpl() { 14697a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe SetUpForTest(false, "maxParamNumber", longSig, 14707a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber)); 14717a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14727a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jvalue args[254]; 14737a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14747a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe // First test: test with all arguments null. 14757a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe for (int i = 0; i < 254; ++i) { 14767a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe args[i].l = nullptr; 14777a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe } 14787a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14797a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args); 14807a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14817a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe // Second test: test with int[] objects with increasing lengths 14827a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe for (int i = 0; i < 254; ++i) { 14837a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe jintArray tmp = env_->NewIntArray(i); 14847a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe args[i].l = tmp; 14857a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe EXPECT_NE(args[i].l, nullptr); 14867a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe } 14877a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14887a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args); 14897a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe} 14907a0e504e60441012c78fc2f3ab8d4da131185c50Andreas Gampe 14916e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(MaxParamNumber) 14926e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 14936e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::WithoutImplementationImpl() { 1494369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe // This will lead to error messages in the log. 1495369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe ScopedLogSeverity sls(LogSeverity::FATAL); 1496369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe 1497ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe SetUpForTest(false, "withoutImplementation", "()V", nullptr); 1498ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe 1499ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe env_->CallVoidMethod(jobj_, jmethod_); 1500ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe 1501ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe EXPECT_TRUE(Thread::Current()->IsExceptionPending()); 1502ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE); 1503ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe} 1504ad61517890168ff6ed19063cc8032a9c033d135bAndreas Gampe 15056e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(WithoutImplementation) 15066e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 150748ee356484225ef0d7cfa197b1699524b866c802Andreas Gampevoid JniCompilerTest::WithoutImplementationRefReturnImpl() { 150848ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe // This will lead to error messages in the log. 150948ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe ScopedLogSeverity sls(LogSeverity::FATAL); 151048ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe 151148ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe SetUpForTest(false, "withoutImplementationRefReturn", "()Ljava/lang/Object;", nullptr); 151248ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe 151348ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe env_->CallObjectMethod(jobj_, jmethod_); 151448ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe 151548ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe EXPECT_TRUE(Thread::Current()->IsExceptionPending()); 151648ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE); 151748ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe} 151848ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe 151948ee356484225ef0d7cfa197b1699524b866c802Andreas GampeJNI_TEST(WithoutImplementationRefReturn) 152048ee356484225ef0d7cfa197b1699524b866c802Andreas Gampe 15216a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersvoid Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3, 15221dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i4, jint i5, jint i6, jint i7, jint i8, jint i9, 15231dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4, 15241dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9, 15251dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f10) { 15261dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i1, 1); 15271dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i2, 2); 15281dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i3, 3); 15291dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i4, 4); 15301dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i5, 5); 15311dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i6, 6); 15321dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i7, 7); 15331dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i8, 8); 15341dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i9, 9); 15351dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i10, 10); 15361dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 1537da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i11 = bit_cast<jint, jfloat>(f1); 15381dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i11, 11); 1539da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i12 = bit_cast<jint, jfloat>(f2); 15401dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i12, 12); 1541da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i13 = bit_cast<jint, jfloat>(f3); 15421dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i13, 13); 1543da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i14 = bit_cast<jint, jfloat>(f4); 15441dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i14, 14); 1545da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i15 = bit_cast<jint, jfloat>(f5); 15461dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i15, 15); 1547da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i16 = bit_cast<jint, jfloat>(f6); 15481dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i16, 16); 1549da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i17 = bit_cast<jint, jfloat>(f7); 15501dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i17, 17); 1551da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i18 = bit_cast<jint, jfloat>(f8); 15521dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i18, 18); 1553da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i19 = bit_cast<jint, jfloat>(f9); 15541dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i19, 19); 1555da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i20 = bit_cast<jint, jfloat>(f10); 15561dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i20, 20); 15571dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov} 15581dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 15596e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::StackArgsIntsFirstImpl() { 15601dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V", 15611dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst)); 15621dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 15631dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i1 = 1; 15641dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i2 = 2; 15651dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i3 = 3; 15661dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i4 = 4; 15671dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i5 = 5; 15681dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i6 = 6; 15691dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i7 = 7; 15701dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i8 = 8; 15711dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i9 = 9; 15721dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i10 = 10; 15731dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 1574da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f1 = bit_cast<jfloat, jint>(11); 1575da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f2 = bit_cast<jfloat, jint>(12); 1576da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f3 = bit_cast<jfloat, jint>(13); 1577da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f4 = bit_cast<jfloat, jint>(14); 1578da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f5 = bit_cast<jfloat, jint>(15); 1579da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f6 = bit_cast<jfloat, jint>(16); 1580da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f7 = bit_cast<jfloat, jint>(17); 1581da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f8 = bit_cast<jfloat, jint>(18); 1582da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f9 = bit_cast<jfloat, jint>(19); 1583da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f10 = bit_cast<jfloat, jint>(20); 15841dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 15851dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2, 15861dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov f3, f4, f5, f6, f7, f8, f9, f10); 15871dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov} 15881dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 15896e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(StackArgsIntsFirst) 15906e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 15916a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersvoid Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2, 15921dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7, 15931dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2, 15941dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i3, jint i4, jint i5, jint i6, jint i7, jint i8, 15951dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i9, jint i10) { 15961dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i1, 1); 15971dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i2, 2); 15981dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i3, 3); 15991dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i4, 4); 16001dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i5, 5); 16011dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i6, 6); 16021dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i7, 7); 16031dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i8, 8); 16041dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i9, 9); 16051dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i10, 10); 16061dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 1607da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i11 = bit_cast<jint, jfloat>(f1); 16081dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i11, 11); 1609da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i12 = bit_cast<jint, jfloat>(f2); 16101dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i12, 12); 1611da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i13 = bit_cast<jint, jfloat>(f3); 16121dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i13, 13); 1613da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i14 = bit_cast<jint, jfloat>(f4); 16141dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i14, 14); 1615da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i15 = bit_cast<jint, jfloat>(f5); 16161dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i15, 15); 1617da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i16 = bit_cast<jint, jfloat>(f6); 16181dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i16, 16); 1619da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i17 = bit_cast<jint, jfloat>(f7); 16201dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i17, 17); 1621da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i18 = bit_cast<jint, jfloat>(f8); 16221dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i18, 18); 1623da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i19 = bit_cast<jint, jfloat>(f9); 16241dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i19, 19); 1625da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i20 = bit_cast<jint, jfloat>(f10); 16261dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i20, 20); 16271dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov} 16281dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 16296e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::StackArgsFloatsFirstImpl() { 16301dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V", 16311dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst)); 16321dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 16331dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i1 = 1; 16341dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i2 = 2; 16351dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i3 = 3; 16361dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i4 = 4; 16371dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i5 = 5; 16381dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i6 = 6; 16391dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i7 = 7; 16401dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i8 = 8; 16411dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i9 = 9; 16421dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i10 = 10; 16431dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 1644da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f1 = bit_cast<jfloat, jint>(11); 1645da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f2 = bit_cast<jfloat, jint>(12); 1646da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f3 = bit_cast<jfloat, jint>(13); 1647da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f4 = bit_cast<jfloat, jint>(14); 1648da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f5 = bit_cast<jfloat, jint>(15); 1649da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f6 = bit_cast<jfloat, jint>(16); 1650da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f7 = bit_cast<jfloat, jint>(17); 1651da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f8 = bit_cast<jfloat, jint>(18); 1652da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f9 = bit_cast<jfloat, jint>(19); 1653da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f10 = bit_cast<jfloat, jint>(20); 16541dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 16551dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3, 16561dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov i4, i5, i6, i7, i8, i9, i10); 16571dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov} 16581dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 16596e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(StackArgsFloatsFirst) 16606e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 16616a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersvoid Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2, 16621dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5, 16631dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8, 16641dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) { 16651dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i1, 1); 16661dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i2, 2); 16671dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i3, 3); 16681dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i4, 4); 16691dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i5, 5); 16701dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i6, 6); 16711dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i7, 7); 16721dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i8, 8); 16731dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i9, 9); 16741dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i10, 10); 16751dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 1676da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i11 = bit_cast<jint, jfloat>(f1); 16771dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i11, 11); 1678da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i12 = bit_cast<jint, jfloat>(f2); 16791dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i12, 12); 1680da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i13 = bit_cast<jint, jfloat>(f3); 16811dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i13, 13); 1682da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i14 = bit_cast<jint, jfloat>(f4); 16831dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i14, 14); 1684da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i15 = bit_cast<jint, jfloat>(f5); 16851dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i15, 15); 1686da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i16 = bit_cast<jint, jfloat>(f6); 16871dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i16, 16); 1688da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i17 = bit_cast<jint, jfloat>(f7); 16891dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i17, 17); 1690da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i18 = bit_cast<jint, jfloat>(f8); 16911dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i18, 18); 1692da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i19 = bit_cast<jint, jfloat>(f9); 16931dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i19, 19); 1694da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jint i20 = bit_cast<jint, jfloat>(f10); 16951dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov EXPECT_EQ(i20, 20); 16961dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov} 16971dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 16986e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampevoid JniCompilerTest::StackArgsMixedImpl() { 16991dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V", 17001dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed)); 17011dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 17021dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i1 = 1; 17031dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i2 = 2; 17041dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i3 = 3; 17051dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i4 = 4; 17061dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i5 = 5; 17071dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i6 = 6; 17081dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i7 = 7; 17091dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i8 = 8; 17101dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i9 = 9; 17111dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov jint i10 = 10; 17121dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 1713da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f1 = bit_cast<jfloat, jint>(11); 1714da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f2 = bit_cast<jfloat, jint>(12); 1715da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f3 = bit_cast<jfloat, jint>(13); 1716da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f4 = bit_cast<jfloat, jint>(14); 1717da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f5 = bit_cast<jfloat, jint>(15); 1718da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f6 = bit_cast<jfloat, jint>(16); 1719da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f7 = bit_cast<jfloat, jint>(17); 1720da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f8 = bit_cast<jfloat, jint>(18); 1721da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f9 = bit_cast<jfloat, jint>(19); 1722da4d79bc9a4aeb9da7c6259ce4c9c1c3bf545eb8Roland Levillain jfloat f10 = bit_cast<jfloat, jint>(20); 17231dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 17241dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7, 17251dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov f7, i8, f8, i9, f9, i10, f10); 17261dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov} 17271dd61ba3081a52c3e2efdc78d64f5c134eea7895Vladimir Kostyukov 17286e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas GampeJNI_TEST(StackArgsMixed) 17296e498695b60f1532d2264ec6badb1cd6e10ecaa9Andreas Gampe 1730f652d605753f1387e7797461b47116c5dcdf928dLazar Trsicvoid Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3, 1731f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i4, jint i5, jint i6, jint i7, jint i8) { 1732f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i1, 1); 1733f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i2, 2); 1734f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i3, 3); 1735f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i4, 4); 1736f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i5, 5); 1737f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i6, 6); 1738f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i7, 7); 1739f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(i8, -8); 1740f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic 1741f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 1742f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots. 1743f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic // First 8 arguments are passed through registers, check i7 and i8. 1744f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic uint32_t stack1_high = *(&i7 + 1); 1745f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic uint32_t stack2_high = *(&i8 + 1); 1746f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic 1747f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(stack1_high, static_cast<uint32_t>(0)); 1748f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff)); 1749f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic#else 1750f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on " 1751f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic << kRuntimeISA; 1752f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic // Force-print to std::cout so it's also outside the logcat. 1753f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on " 1754f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic << kRuntimeISA << std::endl; 1755f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic#endif 1756f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic} 1757f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic 1758f652d605753f1387e7797461b47116c5dcdf928dLazar Trsicvoid JniCompilerTest::StackArgsSignExtendedMips64Impl() { 1759f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V", 1760f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsSignExtendedMips64)); 1761f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i1 = 1; 1762f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i2 = 2; 1763f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i3 = 3; 1764f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i4 = 4; 1765f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i5 = 5; 1766f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i6 = 6; 1767f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i7 = 7; 1768f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic jint i8 = -8; 1769f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic 1770f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8); 1771f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic} 1772f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic 1773f652d605753f1387e7797461b47116c5dcdf928dLazar TrsicJNI_TEST(StackArgsSignExtendedMips64) 1774f652d605753f1387e7797461b47116c5dcdf928dLazar Trsic 1775b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 1776