jni_internal.cc revision 62f0512bf6d9bc6141358bf22e93afa70dc58b1a
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 */ 16df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "jni_internal.h" 182ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 190af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes#include <dlfcn.h> 2079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 2179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes#include <cstdarg> 220af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes#include <utility> 230af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes#include <vector> 242ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 25ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "atomic.h" 2607ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 2776b6167407c2b6f5d40ad895b2793a6b037f54b2Elliott Hughes#include "base/mutex.h" 281aa246dec5abe212f699de1413a0c4a191ca364aElliott Hughes#include "base/stl_util.h" 299837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers#include "class_linker-inl.h" 304f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/card_table-inl.h" 323dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao#include "interpreter/interpreter.h" 33ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro#include "jni.h" 34ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "mirror/art_field-inl.h" 35ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "mirror/art_method-inl.h" 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h" 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class_loader.h" 382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/throwable.h" 416d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers#include "object_utils.h" 42491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom#include "parsed_options.h" 4353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers#include "reflection.h" 442ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro#include "runtime.h" 45a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include "safe_map.h" 4600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers#include "scoped_thread_state_change.h" 47a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include "ScopedLocalRef.h" 482ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro#include "thread.h" 492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utf.h" 50a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include "UniquePtr.h" 51eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "well_known_classes.h" 52df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 53bb1e8f0a07c12a8b0a2dd3cab6a1a7e825a54c6fElliott Hughesnamespace art { 54bb1e8f0a07c12a8b0a2dd3cab6a1a7e825a54c6fElliott Hughes 557934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kMonitorsInitial = 32; // Arbitrary. 567934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kMonitorsMax = 4096; // Arbitrary sanity check. 572ced6a534157d5d963693346904389c19775d2daElliott Hughes 587934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kLocalsInitial = 64; // Arbitrary. 597934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kLocalsMax = 512; // Arbitrary sanity check. 602ced6a534157d5d963693346904389c19775d2daElliott Hughes 617934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kPinTableInitial = 16; // Arbitrary. 627934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kPinTableMax = 1024; // Arbitrary sanity check. 632ced6a534157d5d963693346904389c19775d2daElliott Hughes 647934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic size_t gGlobalsInitial = 512; // Arbitrary. 657934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic size_t gGlobalsMax = 51200; // Arbitrary sanity check. (Must fit in 16 bits.) 662ced6a534157d5d963693346904389c19775d2daElliott Hughes 677934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kWeakGlobalsInitial = 16; // Arbitrary. 687934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstromstatic const size_t kWeakGlobalsMax = 51200; // Arbitrary sanity check. (Must fit in 16 bits.) 69df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 70e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierstatic jweak AddWeakGlobalReference(ScopedObjectAccess& soa, mirror::Object* obj) 71b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 72c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier return soa.Vm()->AddWeakGlobalReference(soa.Self(), obj); 7345619fcc01fb6db1ac9481a91608eb46f90829e4Ian Rogers} 7445619fcc01fb6db1ac9481a91608eb46f90829e4Ian Rogers 7519c5d3786894af707d8079231105bca1b7dcd096Jeff Haostatic bool IsBadJniVersion(int version) { 7619c5d3786894af707d8079231105bca1b7dcd096Jeff Hao // We don't support JNI_VERSION_1_1. These are the only other valid versions. 7719c5d3786894af707d8079231105bca1b7dcd096Jeff Hao return version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4 && version != JNI_VERSION_1_6; 7819c5d3786894af707d8079231105bca1b7dcd096Jeff Hao} 7919c5d3786894af707d8079231105bca1b7dcd096Jeff Hao 806b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes// Section 12.3.2 of the JNI spec describes JNI class descriptors. They're 816b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes// separated with slashes but aren't wrapped with "L;" like regular descriptors 826b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes// (i.e. "a/b/C" rather than "La/b/C;"). Arrays of reference types are an 836b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes// exception; there the "L;" must be present ("[La/b/C;"). Historically we've 846b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes// supported names with dots too (such as "a.b.C"). 850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersstatic std::string NormalizeJniClassDescriptor(const char* name) { 866b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes std::string result; 876b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes // Add the missing "L;" if necessary. 886b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes if (name[0] == '[') { 896b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes result = name; 906b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes } else { 916b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes result += 'L'; 926b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes result += name; 936b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes result += ';'; 946b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes } 956b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes // Rewrite '.' as '/' for backwards compatibility. 96a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes if (result.find('.') != std::string::npos) { 97a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes LOG(WARNING) << "Call to JNI FindClass with dots in name: " 98a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes << "\"" << name << "\""; 99a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes std::replace(result.begin(), result.end(), '.', '/'); 1006b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes } 1016b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes return result; 1026b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes} 1036b436857669d8d1d9be43a70fd8fd33e508276ceElliott Hughes 104e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierstatic void ThrowNoSuchMethodError(ScopedObjectAccess& soa, mirror::Class* c, 10500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const char* name, const char* sig, const char* kind) 106b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 10762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = soa.Self()->GetCurrentLocationForThrow(); 10862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ThrowNewExceptionF(throw_location, "Ljava/lang/NoSuchMethodError;", 10962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers "no %s method \"%s.%s%s\"", 11062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers kind, ClassHelper(c).GetDescriptor(), name, sig); 11114134a10e9bbaff0faf314dc00c1a1aeef8ef86bElliott Hughes} 11214134a10e9bbaff0faf314dc00c1a1aeef8ef86bElliott Hughes 113c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartierstatic mirror::Class* EnsureInitialized(Thread* self, mirror::Class* klass) 114c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 115c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (LIKELY(klass->IsInitialized())) { 116c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return klass; 117c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier } 118c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier SirtRef<mirror::Class> sirt_klass(self, klass); 119c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(sirt_klass, true, true)) { 120c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 121c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier } 122c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return sirt_klass.get(); 123c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier} 124c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier 12500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersstatic jmethodID FindMethodID(ScopedObjectAccess& soa, jclass jni_class, 12600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const char* name, const char* sig, bool is_static) 127b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 128e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(jni_class)); 129c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (c == nullptr) { 130c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 131cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 132e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtMethod* method = nullptr; 133cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes if (is_static) { 134cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes method = c->FindDirectMethod(name, sig); 135cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } else { 136cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes method = c->FindVirtualMethod(name, sig); 137e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (method == nullptr) { 138cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // No virtual method matching the signature. Search declared 139cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // private methods and constructors. 140cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes method = c->FindDeclaredDirectMethod(name, sig); 141cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 142cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 143e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (method == nullptr || method->IsStatic() != is_static) { 14400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowNoSuchMethodError(soa, c, name, sig, is_static ? "static" : "non-static"); 145e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 146cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 14700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.EncodeMethod(method); 148ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro} 149ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 150e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierstatic mirror::ClassLoader* GetClassLoader(const ScopedObjectAccess& soa) 151b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 152e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtMethod* method = soa.Self()->GetCurrentMethod(nullptr); 153ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom // If we are running Runtime.nativeLoad, use the overriding ClassLoader it set. 154ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom if (method == soa.DecodeMethod(WellKnownClasses::java_lang_Runtime_nativeLoad)) { 155ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers return soa.Self()->GetClassLoaderOverride(); 15600fae585c6e4a37b964c77f557fbf84f11e2d930Brian Carlstrom } 157ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom // If we have a method, use its ClassLoader for context. 158e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (method != nullptr) { 159ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom return method->GetDeclaringClass()->GetClassLoader(); 160ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom } 161ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom // We don't have a method, so try to use the system ClassLoader. 162e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ClassLoader* class_loader = 163e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier soa.Decode<mirror::ClassLoader*>(Runtime::Current()->GetSystemClassLoader()); 164e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (class_loader != nullptr) { 165ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom return class_loader; 166ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom } 167ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom // See if the override ClassLoader is set for gtests. 168ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom class_loader = soa.Self()->GetClassLoaderOverride(); 169e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (class_loader != nullptr) { 170a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom // If so, CommonCompilerTest should have set UseCompileTimeClassPath. 171ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom CHECK(Runtime::Current()->UseCompileTimeClassPath()); 172ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom return class_loader; 173ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom } 174ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom // Use the BOOTCLASSPATH. 175e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 17600fae585c6e4a37b964c77f557fbf84f11e2d930Brian Carlstrom} 17700fae585c6e4a37b964c77f557fbf84f11e2d930Brian Carlstrom 17800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersstatic jfieldID FindFieldID(const ScopedObjectAccess& soa, jclass jni_class, const char* name, 17900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const char* sig, bool is_static) 180b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 181e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SirtRef<mirror::Class> c(soa.Self(), EnsureInitialized(soa.Self(), 182e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier soa.Decode<mirror::Class*>(jni_class))); 183e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (c.get() == nullptr) { 184c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 185cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 186e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* field = nullptr; 187e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* field_type; 1880cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 1890cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers if (sig[1] != '\0') { 19062509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao SirtRef<mirror::ClassLoader> class_loader(soa.Self(), c->GetClassLoader()); 1919837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers field_type = class_linker->FindClass(soa.Self(), sig, class_loader); 1920cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers } else { 1930cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers field_type = class_linker->FindPrimitiveClass(*sig); 1940cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers } 195e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (field_type == nullptr) { 1960cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers // Failed to find type from the signature of the field. 19700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 19862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location; 199e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SirtRef<mirror::Throwable> cause(soa.Self(), soa.Self()->GetException(&throw_location)); 20000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers soa.Self()->ClearException(); 20162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ThrowNewExceptionF(throw_location, "Ljava/lang/NoSuchFieldError;", 202491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom "no type \"%s\" found and so no field \"%s\" " 203491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom "could be found in class \"%s\" or its superclasses", sig, name, 204e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier ClassHelper(c.get()).GetDescriptor()); 205e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier soa.Self()->GetException(nullptr)->SetCause(cause.get()); 206e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 2070cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers } 208cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes if (is_static) { 2096d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers field = c->FindStaticField(name, ClassHelper(field_type).GetDescriptor()); 2104dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } else { 2116d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers field = c->FindInstanceField(name, ClassHelper(field_type).GetDescriptor()); 2124dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 213e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (field == nullptr) { 21462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = soa.Self()->GetCurrentLocationForThrow(); 21562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ThrowNewExceptionF(throw_location, "Ljava/lang/NoSuchFieldError;", 21662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers "no \"%s\" field \"%s\" in class \"%s\" or its superclasses", 217e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier sig, name, ClassHelper(c.get()).GetDescriptor()); 218e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 219cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 22000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.EncodeField(field); 221ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro} 222ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 223e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierstatic void PinPrimitiveArray(const ScopedObjectAccess& soa, mirror::Array* array) 224b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 22500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JavaVMExt* vm = soa.Vm(); 22650b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(soa.Self(), vm->pins_lock); 2277577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes vm->pin_table.Add(array); 2287577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes} 2297577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 230e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierstatic void UnpinPrimitiveArray(const ScopedObjectAccess& soa, mirror::Array* array) 231b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 23200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JavaVMExt* vm = soa.Vm(); 23350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(soa.Self(), vm->pins_lock); 2347577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes vm->pin_table.Remove(array); 2357577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes} 2367577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 237e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierstatic void ThrowAIOOBE(ScopedObjectAccess& soa, mirror::Array* array, jsize start, 23800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jsize length, const char* identifier) 239b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 24054e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes std::string type(PrettyTypeOf(array)); 24162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = soa.Self()->GetCurrentLocationForThrow(); 24262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ThrowNewExceptionF(throw_location, "Ljava/lang/ArrayIndexOutOfBoundsException;", 24362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers "%s offset=%d length=%d %s.length=%d", 24462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers type.c_str(), start, length, identifier, array->GetLength()); 245814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes} 2460571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers 24700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersstatic void ThrowSIOOBE(ScopedObjectAccess& soa, jsize start, jsize length, 24800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jsize array_length) 249b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 25062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = soa.Self()->GetCurrentLocationForThrow(); 25162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ThrowNewExceptionF(throw_location, "Ljava/lang/StringIndexOutOfBoundsException;", 25262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers "offset=%d length=%d string.length()=%d", start, length, 25362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers array_length); 254b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes} 255814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 25600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersint ThrowNewException(JNIEnv* env, jclass exception_class, const char* msg, jobject cause) 257b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::mutator_lock_) { 25800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Turn the const char* into a java.lang.String. 25900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedLocalRef<jstring> s(env, env->NewStringUTF(msg)); 260e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (msg != nullptr && s.get() == nullptr) { 26100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return JNI_ERR; 262814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes } 263814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 26400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Choose an appropriate constructor and set up the arguments. 26500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jvalue args[2]; 26600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const char* signature; 267e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (msg == nullptr && cause == nullptr) { 26800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers signature = "()V"; 269e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier } else if (msg != nullptr && cause == nullptr) { 27000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers signature = "(Ljava/lang/String;)V"; 27100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers args[0].l = s.get(); 272e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier } else if (msg == nullptr && cause != nullptr) { 27300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers signature = "(Ljava/lang/Throwable;)V"; 27400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers args[0].l = cause; 275814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes } else { 27600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers signature = "(Ljava/lang/String;Ljava/lang/Throwable;)V"; 27700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers args[0].l = s.get(); 27800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers args[1].l = cause; 27900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 28000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jmethodID mid = env->GetMethodID(exception_class, "<init>", signature); 281e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (mid == nullptr) { 282ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers ScopedObjectAccess soa(env); 28300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOG(ERROR) << "No <init>" << signature << " in " 284e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier << PrettyClass(soa.Decode<mirror::Class*>(exception_class)); 28500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return JNI_ERR; 286814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes } 287a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes 288e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier ScopedLocalRef<jthrowable> exception( 289e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier env, reinterpret_cast<jthrowable>(env->NewObjectA(exception_class, mid, args))); 290e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (exception.get() == nullptr) { 29100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return JNI_ERR; 29200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 293ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers ScopedObjectAccess soa(env); 29462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = soa.Self()->GetCurrentLocationForThrow(); 295e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier soa.Self()->SetException(throw_location, soa.Decode<mirror::Throwable*>(exception.get())); 29600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return JNI_OK; 297a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes} 298a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes 299462c94449720e0dc6b93d7138d835d345ccf67aeElliott Hughesstatic jint JII_AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, void* raw_args, bool as_daemon) { 300e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (vm == nullptr || p_env == nullptr) { 3017577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes return JNI_ERR; 3027577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 3037577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 304462c94449720e0dc6b93d7138d835d345ccf67aeElliott Hughes // Return immediately if we're already attached. 305cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes Thread* self = Thread::Current(); 306e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (self != nullptr) { 307cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes *p_env = self->GetJniEnv(); 308cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes return JNI_OK; 309cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes } 310cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes 311cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes Runtime* runtime = reinterpret_cast<JavaVMExt*>(vm)->runtime; 312cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes 313cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes // No threads allowed in zygote mode. 314cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes if (runtime->IsZygote()) { 315cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes LOG(ERROR) << "Attempt to attach a thread in the zygote"; 316cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes return JNI_ERR; 317cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes } 318cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes 319462c94449720e0dc6b93d7138d835d345ccf67aeElliott Hughes JavaVMAttachArgs* args = static_cast<JavaVMAttachArgs*>(raw_args); 320e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier const char* thread_name = nullptr; 321e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier jobject thread_group = nullptr; 322e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (args != nullptr) { 32383a25328c595975097cf3948451088cbfc64fc09Elliott Hughes if (IsBadJniVersion(args->version)) { 32483a25328c595975097cf3948451088cbfc64fc09Elliott Hughes LOG(ERROR) << "Bad JNI version passed to " 32583a25328c595975097cf3948451088cbfc64fc09Elliott Hughes << (as_daemon ? "AttachCurrentThreadAsDaemon" : "AttachCurrentThread") << ": " 32683a25328c595975097cf3948451088cbfc64fc09Elliott Hughes << args->version; 32783a25328c595975097cf3948451088cbfc64fc09Elliott Hughes return JNI_EVERSION; 3288692215f793cbf8be9c3d25a705074ca877e09b8Brian Carlstrom } 329462c94449720e0dc6b93d7138d835d345ccf67aeElliott Hughes thread_name = args->name; 330365c10235438607541fa2259a5fec48061b90bd8Ian Rogers thread_group = args->group; 3317577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 3327577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 333664bebf92eb2151b9b570ccd42ac4b6056c3ea9cMathieu Chartier if (!runtime->AttachCurrentThread(thread_name, as_daemon, thread_group, !runtime->IsCompiler())) { 334e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier *p_env = nullptr; 335120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers return JNI_ERR; 336120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers } else { 337120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers *p_env = Thread::Current()->GetJniEnv(); 338120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers return JNI_OK; 339120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers } 3407577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes} 3417577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes 34279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughesclass SharedLibrary { 34379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes public: 344e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SharedLibrary(const std::string& path, void* handle, mirror::Object* class_loader) 34579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes : path_(path), 34679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes handle_(handle), 34731384c59bb4b387f29f2b6d4d3db886c29b81170Shih-wei Liao class_loader_(class_loader), 3488daa0929f08a3080ea64dbd4e997e72f411e6fc9Elliott Hughes jni_on_load_lock_("JNI_OnLoad lock"), 349c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers jni_on_load_cond_("JNI_OnLoad condition variable", jni_on_load_lock_), 350d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers jni_on_load_thread_id_(Thread::Current()->GetThreadId()), 35179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes jni_on_load_result_(kPending) { 35279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 35379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 354e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* GetClassLoader() { 35579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes return class_loader_; 35679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 35779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 35879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes std::string GetPath() { 35979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes return path_; 36079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 36179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 36279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes /* 3631bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes * Check the result of an earlier call to JNI_OnLoad on this library. 3641bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes * If the call has not yet finished in another thread, wait for it. 36579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes */ 36600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers bool CheckOnLoadResult() 36700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(jni_on_load_lock_) 368b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 36979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes Thread* self = Thread::Current(); 37000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers self->TransitionFromRunnableToSuspended(kWaitingForJniOnLoad); 37100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers bool okay; 37200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers { 37350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, jni_on_load_lock_); 37400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 375d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers if (jni_on_load_thread_id_ == self->GetThreadId()) { 37600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Check this so we don't end up waiting for ourselves. We need to return "true" so the 37700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // caller can continue. 37800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOG(INFO) << *self << " recursive attempt to load library " << "\"" << path_ << "\""; 37900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers okay = true; 38000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } else { 38100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers while (jni_on_load_result_ == kPending) { 38200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers VLOG(jni) << "[" << *self << " waiting for \"" << path_ << "\" " << "JNI_OnLoad...]"; 383c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers jni_on_load_cond_.Wait(self); 38400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 38579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 38600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers okay = (jni_on_load_result_ == kOkay); 38700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers VLOG(jni) << "[Earlier JNI_OnLoad for \"" << path_ << "\" " 38800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers << (okay ? "succeeded" : "failed") << "]"; 38900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 39079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 39100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers self->TransitionFromSuspendedToRunnable(); 39279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes return okay; 39379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 39479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 39500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void SetResult(bool result) LOCKS_EXCLUDED(jni_on_load_lock_) { 396c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers Thread* self = Thread::Current(); 397c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers MutexLock mu(self, jni_on_load_lock_); 398f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes 39979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes jni_on_load_result_ = result ? kOkay : kFailed; 400dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes jni_on_load_thread_id_ = 0; 40179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 40279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Broadcast a wakeup to anybody sleeping on the condition variable. 403c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers jni_on_load_cond_.Broadcast(self); 40479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 40579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 40679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes void* FindSymbol(const std::string& symbol_name) { 40779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes return dlsym(handle_, symbol_name.c_str()); 40879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 40979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 41083c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier void VisitRoots(RootCallback* visitor, void* arg) { 4118f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier if (class_loader_ != nullptr) { 412815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier visitor(&class_loader_, arg, 0, kRootVMInternal); 4138f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier } 4148f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier } 4158f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier 41679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes private: 41779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes enum JNI_OnLoadState { 41879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes kPending, 41979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes kFailed, 42079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes kOkay, 42179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes }; 42279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 42379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Path to library "/system/lib/libjni.so". 42479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes std::string path_; 42579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 42679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // The void* returned by dlopen(3). 42779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes void* handle_; 42879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 42979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // The ClassLoader this library is associated with. 430e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* class_loader_; 43179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 43279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Guards remaining items. 43300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Mutex jni_on_load_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 43479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Wait for JNI_OnLoad in other thread. 435c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers ConditionVariable jni_on_load_cond_ GUARDED_BY(jni_on_load_lock_); 43679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Recursive invocation guard. 437f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes uint32_t jni_on_load_thread_id_ GUARDED_BY(jni_on_load_lock_); 43879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Result of earlier JNI_OnLoad call. 439f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes JNI_OnLoadState jni_on_load_result_ GUARDED_BY(jni_on_load_lock_); 44079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes}; 44179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 44279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes// This exists mainly to keep implementation details out of the header file. 44379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughesclass Libraries { 44479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes public: 44579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes Libraries() { 44679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 44779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 44879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes ~Libraries() { 449c31664f3d82e6cd68275a529a8a73f067a52e8beElliott Hughes STLDeleteValues(&libraries_); 45079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 45179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 452ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes void Dump(std::ostream& os) const { 453ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes bool first = true; 45402e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier for (const auto& library : libraries_) { 455ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes if (!first) { 456ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << ' '; 457ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 458ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes first = false; 45902e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier os << library.first; 460ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 461ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 462ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes 463ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes size_t size() const { 464ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes return libraries_.size(); 465ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 466ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes 46779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes SharedLibrary* Get(const std::string& path) { 46802e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier auto it = libraries_.find(path); 469e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return (it == libraries_.end()) ? nullptr : it->second; 47079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 47179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 47279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes void Put(const std::string& path, SharedLibrary* library) { 473a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes libraries_.Put(path, library); 47479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 47579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 47679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // See section 11.3 "Linking Native Methods" of the JNI spec. 477e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier void* FindNativeMethod(mirror::ArtMethod* m, std::string& detail) 478b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 47979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes std::string jni_short_name(JniShortName(m)); 48079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes std::string jni_long_name(JniLongName(m)); 481e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier const mirror::ClassLoader* declaring_class_loader = m->GetDeclaringClass()->GetClassLoader(); 48202e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier for (const auto& lib : libraries_) { 48302e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier SharedLibrary* library = lib.second; 48479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes if (library->GetClassLoader() != declaring_class_loader) { 48579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // We only search libraries loaded by the appropriate ClassLoader. 48679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes continue; 48779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 48879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Try the short name then the long name... 48979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes void* fn = library->FindSymbol(jni_short_name); 490e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (fn == nullptr) { 49179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes fn = library->FindSymbol(jni_long_name); 49279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 493e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (fn != nullptr) { 4944dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes VLOG(jni) << "[Found native code for " << PrettyMethod(m) 4954dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes << " in \"" << library->GetPath() << "\"]"; 49679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes return fn; 49779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 49879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 49979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes detail += "No implementation found for "; 500a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes detail += PrettyMethod(m); 50192827a5fc2598589b3717269cc09c33b8c53f30bBrian Carlstrom detail += " (tried " + jni_short_name + " and " + jni_long_name + ")"; 50279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes LOG(ERROR) << detail; 503e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 50479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 50579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 50683c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier void VisitRoots(RootCallback* callback, void* arg) { 5078f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier for (auto& lib_pair : libraries_) { 50883c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier lib_pair.second->VisitRoots(callback, arg); 5098f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier } 5108f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier } 5118f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier 51279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes private: 513a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes SafeMap<std::string, SharedLibrary*> libraries_; 51479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes}; 51579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 516bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers#define CHECK_NON_NULL_ARGUMENT(fn, value) \ 517e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (UNLIKELY(value == nullptr)) { \ 518bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers JniAbortF(#fn, #value " == null"); \ 519bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers } 520bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers 5214ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers#define CHECK_NON_NULL_MEMCPY_ARGUMENT(fn, length, value) \ 522e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (UNLIKELY(length != 0 && value == nullptr)) { \ 5234ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers JniAbortF(#fn, #value " == null"); \ 5244ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers } 5254ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers 526cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughesclass JNI { 527cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes public: 52825e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers static jint GetVersion(JNIEnv*) { 529cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_VERSION_1_6; 530cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 531cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 53225e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers static jclass DefineClass(JNIEnv*, const char*, jobject, const jbyte*, jsize) { 533cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes LOG(WARNING) << "JNI DefineClass is not supported"; 534e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 53518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes } 53618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 537cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jclass FindClass(JNIEnv* env, const char* name) { 538bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(FindClass, name); 5395fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes Runtime* runtime = Runtime::Current(); 5405fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes ClassLinker* class_linker = runtime->GetClassLinker(); 541cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes std::string descriptor(NormalizeJniClassDescriptor(name)); 542ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ScopedObjectAccess soa(env); 543e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = nullptr; 5445fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes if (runtime->IsStarted()) { 545590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier SirtRef<mirror::ClassLoader> class_loader(soa.Self(), GetClassLoader(soa)); 5469837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers c = class_linker->FindClass(soa.Self(), descriptor.c_str(), class_loader); 5475fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes } else { 5489837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers c = class_linker->FindSystemClass(soa.Self(), descriptor.c_str()); 5495fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes } 55000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jclass>(c); 551cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 552ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 55362f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers static jmethodID FromReflectedMethod(JNIEnv* env, jobject jlr_method) { 55462f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers CHECK_NON_NULL_ARGUMENT(FromReflectedMethod, jlr_method); 55500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 55662f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return soa.EncodeMethod(mirror::ArtMethod::FromReflectedMethod(soa, jlr_method)); 55718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes } 55818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 55962f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers static jfieldID FromReflectedField(JNIEnv* env, jobject jlr_field) { 56062f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers CHECK_NON_NULL_ARGUMENT(FromReflectedField, jlr_field); 56100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 56262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return soa.EncodeField(mirror::ArtField::FromReflectedField(soa, jlr_field)); 563cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 56418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 565cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jobject ToReflectedMethod(JNIEnv* env, jclass, jmethodID mid, jboolean) { 566bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(ToReflectedMethod, mid); 56700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 568e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtMethod* m = soa.DecodeMethod(mid); 569e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier CHECK(!kMovingMethods); 570ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom jobject art_method = soa.AddLocalReference<jobject>(m); 571ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom jobject reflect_method = env->AllocObject(WellKnownClasses::java_lang_reflect_Method); 572ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom if (env->ExceptionCheck()) { 573e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 574ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom } 575e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetObjectField(env, reflect_method, 576e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier WellKnownClasses::java_lang_reflect_AbstractMethod_artMethod, art_method); 577ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return reflect_method; 57818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes } 579ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 580cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jobject ToReflectedField(JNIEnv* env, jclass, jfieldID fid, jboolean) { 581bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(ToReflectedField, fid); 58200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 583e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); 584ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom jobject art_field = soa.AddLocalReference<jobject>(f); 585ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom jobject reflect_field = env->AllocObject(WellKnownClasses::java_lang_reflect_Field); 586ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom if (env->ExceptionCheck()) { 587e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 588ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom } 589e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetObjectField(env, reflect_field, 590e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier WellKnownClasses::java_lang_reflect_Field_artField, art_field); 591ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return reflect_field; 592cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 593cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 59437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes static jclass GetObjectClass(JNIEnv* env, jobject java_object) { 595bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetObjectClass, java_object); 59600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 597e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(java_object); 59800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jclass>(o->GetClass()); 59937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 60037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 601885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jclass GetSuperclass(JNIEnv* env, jclass java_class) { 602bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetSuperclass, java_class); 60300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 604e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = soa.Decode<mirror::Class*>(java_class); 60500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jclass>(c->GetSuperClass()); 60618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes } 60718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 60837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes static jboolean IsAssignableFrom(JNIEnv* env, jclass java_class1, jclass java_class2) { 609bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(IsAssignableFrom, java_class1); 610bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(IsAssignableFrom, java_class2); 61100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 612e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c1 = soa.Decode<mirror::Class*>(java_class1); 613e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c2 = soa.Decode<mirror::Class*>(java_class2); 61437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes return c1->IsAssignableFrom(c2) ? JNI_TRUE : JNI_FALSE; 615cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 61618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 617e84278b035c8a48f6032ef98fae008d875fba7a4Elliott Hughes static jboolean IsInstanceOf(JNIEnv* env, jobject jobj, jclass java_class) { 618bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(IsInstanceOf, java_class); 619e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (jobj == nullptr) { 6205d40f182181488eb39ccd19ffd306bb1fb9740c9Brian Carlstrom // Note: JNI is different from regular Java instanceof in this respect 62137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes return JNI_TRUE; 62237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } else { 623ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ScopedObjectAccess soa(env); 624e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 625e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = soa.Decode<mirror::Class*>(java_class); 626e84278b035c8a48f6032ef98fae008d875fba7a4Elliott Hughes return obj->InstanceOf(c) ? JNI_TRUE : JNI_FALSE; 62737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 62837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 62937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 63037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes static jint Throw(JNIEnv* env, jthrowable java_exception) { 63100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 632e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Throwable* exception = soa.Decode<mirror::Throwable*>(java_exception); 633e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (exception == nullptr) { 63437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes return JNI_ERR; 63537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 63662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = soa.Self()->GetCurrentLocationForThrow(); 63762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->SetException(throw_location, exception); 63837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes return JNI_OK; 63937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 64037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 641e5b0dc83537bf915c6abe4efeae6e501daf75a27Elliott Hughes static jint ThrowNew(JNIEnv* env, jclass c, const char* msg) { 642bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(ThrowNew, c); 643e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return ThrowNewException(env, c, msg, nullptr); 64437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 64537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 64637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes static jboolean ExceptionCheck(JNIEnv* env) { 647120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers return static_cast<JNIEnvExt*>(env)->self->IsExceptionPending() ? JNI_TRUE : JNI_FALSE; 64837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes } 64937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes 65037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes static void ExceptionClear(JNIEnv* env) { 651120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers static_cast<JNIEnvExt*>(env)->self->ClearException(); 65218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes } 65318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 65437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes static void ExceptionDescribe(JNIEnv* env) { 65500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 65672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes 657e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SirtRef<mirror::Object> old_throw_this_object(soa.Self(), nullptr); 658e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SirtRef<mirror::ArtMethod> old_throw_method(soa.Self(), nullptr); 659e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SirtRef<mirror::Throwable> old_exception(soa.Self(), nullptr); 66062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers uint32_t old_throw_dex_pc; 66162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers { 66262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation old_throw_location; 663e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Throwable* old_exception_obj = soa.Self()->GetException(&old_throw_location); 66462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_this_object.reset(old_throw_location.GetThis()); 66562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_method.reset(old_throw_location.GetMethod()); 66662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_exception.reset(old_exception_obj); 66762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_dex_pc = old_throw_location.GetDexPc(); 66862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ClearException(); 66962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 670491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom ScopedLocalRef<jthrowable> exception(env, 671491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom soa.AddLocalReference<jthrowable>(old_exception.get())); 67272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes ScopedLocalRef<jclass> exception_class(env, env->GetObjectClass(exception.get())); 67372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes jmethodID mid = env->GetMethodID(exception_class.get(), "printStackTrace", "()V"); 674e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (mid == nullptr) { 67572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes LOG(WARNING) << "JNI WARNING: no printStackTrace()V in " 67662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers << PrettyTypeOf(old_exception.get()); 67772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes } else { 67872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes env->CallVoidMethod(exception.get(), mid); 67962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (soa.Self()->IsExceptionPending()) { 680e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier LOG(WARNING) << "JNI WARNING: " << PrettyTypeOf(soa.Self()->GetException(nullptr)) 68172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes << " thrown while calling printStackTrace"; 68262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->ClearException(); 68372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes } 68472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes } 68562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation gc_safe_throw_location(old_throw_this_object.get(), old_throw_method.get(), 68662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_dex_pc); 68772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes 68862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers soa.Self()->SetException(gc_safe_throw_location, old_exception.get()); 689cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 69018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 691cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jthrowable ExceptionOccurred(JNIEnv* env) { 69200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 693e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* exception = soa.Self()->GetException(nullptr); 69400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jthrowable>(exception); 69518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes } 69618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 69725e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers static void FatalError(JNIEnv*, const char* msg) { 698cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes LOG(FATAL) << "JNI FatalError called: " << msg; 699cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 70018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes 7012ced6a534157d5d963693346904389c19775d2daElliott Hughes static jint PushLocalFrame(JNIEnv* env, jint capacity) { 702ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers if (EnsureLocalCapacity(env, capacity, "PushLocalFrame") != JNI_OK) { 7032ced6a534157d5d963693346904389c19775d2daElliott Hughes return JNI_ERR; 7042ced6a534157d5d963693346904389c19775d2daElliott Hughes } 705ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers static_cast<JNIEnvExt*>(env)->PushFrame(capacity); 706cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_OK; 707c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes } 708c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes 7092ced6a534157d5d963693346904389c19775d2daElliott Hughes static jobject PopLocalFrame(JNIEnv* env, jobject java_survivor) { 71000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 711e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* survivor = soa.Decode<mirror::Object*>(java_survivor); 71200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers soa.Env()->PopFrame(); 71300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(survivor); 714cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 715c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes 7162ced6a534157d5d963693346904389c19775d2daElliott Hughes static jint EnsureLocalCapacity(JNIEnv* env, jint desired_capacity) { 717ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers return EnsureLocalCapacity(env, desired_capacity, "EnsureLocalCapacity"); 71872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes } 71972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes 720cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jobject NewGlobalRef(JNIEnv* env, jobject obj) { 72125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 722e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* decoded_obj = soa.Decode<mirror::Object*>(obj); 723e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier // Check for null after decoding the object to handle cleared weak globals. 724e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier if (decoded_obj == nullptr) { 725e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier return nullptr; 726e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier } 72700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JavaVMExt* vm = soa.Vm(); 728cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes IndirectReferenceTable& globals = vm->globals; 729b8a0b94735f188bc739e4c55479c37699006b881Ian Rogers WriterMutexLock mu(soa.Self(), vm->globals_lock); 73000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers IndirectRef ref = globals.Add(IRT_FIRST_SEGMENT, decoded_obj); 731cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return reinterpret_cast<jobject>(ref); 732c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes } 733ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 734cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static void DeleteGlobalRef(JNIEnv* env, jobject obj) { 735e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (obj == nullptr) { 736cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return; 737cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 738ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers JavaVMExt* vm = reinterpret_cast<JNIEnvExt*>(env)->vm; 739cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes IndirectReferenceTable& globals = vm->globals; 740ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers Thread* self = reinterpret_cast<JNIEnvExt*>(env)->self; 741b8a0b94735f188bc739e4c55479c37699006b881Ian Rogers WriterMutexLock mu(self, vm->globals_lock); 742ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 743cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes if (!globals.Remove(IRT_FIRST_SEGMENT, obj)) { 744cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes LOG(WARNING) << "JNI WARNING: DeleteGlobalRef(" << obj << ") " 745cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes << "failed to find entry"; 746cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 747cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 748ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 749cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jweak NewWeakGlobalRef(JNIEnv* env, jobject obj) { 75000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 751e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return AddWeakGlobalReference(soa, soa.Decode<mirror::Object*>(obj)); 752cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 753ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 754cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static void DeleteWeakGlobalRef(JNIEnv* env, jweak obj) { 755c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier if (obj != nullptr) { 756c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier ScopedObjectAccess soa(env); 757c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier soa.Vm()->DeleteWeakGlobalRef(soa.Self(), obj); 758cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 759cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 760ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 761cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jobject NewLocalRef(JNIEnv* env, jobject obj) { 76225e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 763e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* decoded_obj = soa.Decode<mirror::Object*>(obj); 764e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier // Check for null after decoding the object to handle cleared weak globals. 765e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier if (decoded_obj == nullptr) { 766e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier return nullptr; 767e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier } 768e8c48db6bb507d7fa20c78481c58c23be0045f67Mathieu Chartier return soa.AddLocalReference<jobject>(decoded_obj); 7694dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 770ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 771cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static void DeleteLocalRef(JNIEnv* env, jobject obj) { 772e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (obj == nullptr) { 773cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return; 774cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 775ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers IndirectReferenceTable& locals = reinterpret_cast<JNIEnvExt*>(env)->locals; 776cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 777ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers uint32_t cookie = reinterpret_cast<JNIEnvExt*>(env)->local_ref_cookie; 778cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes if (!locals.Remove(cookie, obj)) { 779cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Attempting to delete a local reference that is not in the 780cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // topmost local reference frame is a no-op. DeleteLocalRef returns 781cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // void and doesn't throw any exceptions, but we should probably 782cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // complain about it so the user will notice that things aren't 783cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // going quite the way they expect. 784cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes LOG(WARNING) << "JNI WARNING: DeleteLocalRef(" << obj << ") " 785cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes << "failed to find entry"; 786cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 78783ab4f3b4e5544dc78c059e139f20cf93e5c6ce6Carl Shapiro } 788cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 789cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jboolean IsSameObject(JNIEnv* env, jobject obj1, jobject obj2) { 790ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom if (obj1 == obj2) { 791ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return JNI_TRUE; 792ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom } else { 793ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ScopedObjectAccess soa(env); 794491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom return (soa.Decode<mirror::Object*>(obj1) == soa.Decode<mirror::Object*>(obj2)) 795491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom ? JNI_TRUE : JNI_FALSE; 796ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom } 79783ab4f3b4e5544dc78c059e139f20cf93e5c6ce6Carl Shapiro } 798cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 799885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jobject AllocObject(JNIEnv* env, jclass java_class) { 800bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(AllocObject, java_class); 80100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 802e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(java_class)); 803c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (c == nullptr) { 804c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 805885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 80650b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers return soa.AddLocalReference<jobject>(c->AllocObject(soa.Self())); 807cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 808cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 809bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jobject NewObject(JNIEnv* env, jclass java_class, jmethodID mid, ...) { 810cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list args; 81172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(args, mid); 812bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(NewObject, java_class); 813bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(NewObject, mid); 814bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jobject result = NewObjectV(env, java_class, mid, args); 815cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(args); 816cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return result; 817cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 818cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 81972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jobject NewObjectV(JNIEnv* env, jclass java_class, jmethodID mid, va_list args) { 820bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(NewObjectV, java_class); 821bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(NewObjectV, mid); 82200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 823e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(java_class)); 824c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (c == nullptr) { 825c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 826885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 827e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* result = c->AllocObject(soa.Self()); 828c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (result == nullptr) { 829c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 83030646836b4a1c6e5e80ddaea246cf9669eaa0628Elliott Hughes } 83100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject local_result = soa.AddLocalReference<jobject>(result); 83272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes CallNonvirtualVoidMethodV(env, local_result, java_class, mid, args); 833e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (soa.Self()->IsExceptionPending()) { 834c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 8355d4bdc29737a693027daaf6ed3f0792368eb4baeIan Rogers } 836e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return local_result; 837cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 838cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 83972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jobject NewObjectA(JNIEnv* env, jclass java_class, jmethodID mid, jvalue* args) { 840bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(NewObjectA, java_class); 841bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(NewObjectA, mid); 84200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 843e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(java_class)); 844c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (c == nullptr) { 845c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 846885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 847e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* result = c->AllocObject(soa.Self()); 848e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (result == nullptr) { 849e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 85030646836b4a1c6e5e80ddaea246cf9669eaa0628Elliott Hughes } 85100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject local_result = soa.AddLocalReference<jobjectArray>(result); 85272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes CallNonvirtualVoidMethodA(env, local_result, java_class, mid, args); 853e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (soa.Self()->IsExceptionPending()) { 854e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 8555d4bdc29737a693027daaf6ed3f0792368eb4baeIan Rogers } 856e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return local_result; 857cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 858cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 859bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jmethodID GetMethodID(JNIEnv* env, jclass java_class, const char* name, const char* sig) { 860bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetMethodID, java_class); 861bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetMethodID, name); 862bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetMethodID, sig); 86300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 864bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return FindMethodID(soa, java_class, name, sig, false); 865cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 866ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 867bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jmethodID GetStaticMethodID(JNIEnv* env, jclass java_class, const char* name, 868bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const char* sig) { 869bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStaticMethodID, java_class); 870bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStaticMethodID, name); 871bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStaticMethodID, sig); 87200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 873bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return FindMethodID(soa, java_class, name, sig, true); 874cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 875ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 87672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jobject CallObjectMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 87772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 87872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 879bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallObjectMethod, obj); 880bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallObjectMethod, mid); 88125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 88200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 88372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 88400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 885cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 886ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 88772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jobject CallObjectMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 888bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallObjectMethodV, obj); 889bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallObjectMethodV, mid); 89000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 89100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args)); 89200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 893cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 894ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 89572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jobject CallObjectMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 896bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallObjectMethodA, obj); 897bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallObjectMethodA, mid); 89800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 89953b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers JValue result(InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 90053b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args)); 90100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 902cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 903ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 90472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jboolean CallBooleanMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 90572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 90672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 907bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallBooleanMethod, obj); 908bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallBooleanMethod, mid); 90925e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 91000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 91172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 912f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetZ(); 913cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 914ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 91572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jboolean CallBooleanMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 916bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallBooleanMethodV, obj); 917bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallBooleanMethodV, mid); 91800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 91900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetZ(); 920cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 921ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 92272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jboolean CallBooleanMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 923bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallBooleanMethodA, obj); 924bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallBooleanMethodA, mid); 92500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 92653b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 92753b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetZ(); 928cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 929ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 93072025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jbyte CallByteMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 93172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 93272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 933bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallByteMethod, obj); 934bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallByteMethod, mid); 935bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers ScopedObjectAccess soa(env); 93600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 93772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 938f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetB(); 939cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 940ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 94172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jbyte CallByteMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 942bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallByteMethodV, obj); 943bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallByteMethodV, mid); 94400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 94500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetB(); 946cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 947ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 94872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jbyte CallByteMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 949bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallByteMethodA, obj); 950bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallByteMethodA, mid); 95100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 95253b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 95353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetB(); 954cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 955ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 95672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jchar CallCharMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 95772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 95872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 959bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallCharMethod, obj); 960bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallCharMethod, mid); 96125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 96200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 96372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 964f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetC(); 965cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 966ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 96772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jchar CallCharMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 968bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallCharMethodV, obj); 969bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallCharMethodV, mid); 97000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 97100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetC(); 972cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 973ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 97472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jchar CallCharMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 975bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallCharMethodA, obj); 976bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallCharMethodA, mid); 97700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 97853b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 97953b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetC(); 980cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 981ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 98272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jdouble CallDoubleMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 98372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 98472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 985bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallDoubleMethod, obj); 986bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallDoubleMethod, mid); 98725e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 98800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 98972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 990f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetD(); 991cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 992ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 99372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jdouble CallDoubleMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 994bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallDoubleMethodV, obj); 995bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallDoubleMethodV, mid); 99600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 99700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetD(); 998cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 999ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 100072025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jdouble CallDoubleMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 1001bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallDoubleMethodA, obj); 1002bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallDoubleMethodA, mid); 100300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 100453b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 100553b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetD(); 1006cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1007ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 100872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jfloat CallFloatMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 100972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 101072025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1011bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallFloatMethod, obj); 1012bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallFloatMethod, mid); 1013bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers ScopedObjectAccess soa(env); 101400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 101572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 1016f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetF(); 1017cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1018ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 101972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jfloat CallFloatMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 1020bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallFloatMethodV, obj); 1021bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallFloatMethodV, mid); 102200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 102300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetF(); 1024cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1025ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 102672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jfloat CallFloatMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 1027bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallFloatMethodA, obj); 1028bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallFloatMethodA, mid); 102900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 103053b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 103153b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetF(); 1032cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1033ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 103472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jint CallIntMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 103572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 103672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1037bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallIntMethod, obj); 1038bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallIntMethod, mid); 103925e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 104000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 104172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 1042f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetI(); 1043cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1044ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 104572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jint CallIntMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 1046bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallIntMethodV, obj); 1047bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallIntMethodV, mid); 104800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 104900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetI(); 1050cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1051ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 105272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jint CallIntMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 1053bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallIntMethodA, obj); 1054bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallIntMethodA, mid); 105500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 105653b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 105753b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetI(); 1058cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1059ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 106072025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jlong CallLongMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 106172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 106272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1063bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallLongMethod, obj); 1064bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallLongMethod, mid); 106525e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 106600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 106772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 1068f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetJ(); 1069cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1070ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 107172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jlong CallLongMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 1072bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallLongMethodV, obj); 1073bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallLongMethodV, mid); 107400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 107500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetJ(); 1076cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1077ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 107872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jlong CallLongMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 1079bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallLongMethodA, obj); 1080bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallLongMethodA, mid); 108100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 108253b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 108353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetJ(); 1084cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1085ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 108672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jshort CallShortMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 108772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 108872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1089bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallShortMethod, obj); 1090bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallShortMethod, mid); 109125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 109200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap)); 109372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 1094f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetS(); 1095cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1096ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 109772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jshort CallShortMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 1098bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallShortMethodV, obj); 1099bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallShortMethodV, mid); 110000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 110100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetS(); 1102cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1103ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 110472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static jshort CallShortMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 1105bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallShortMethodA, obj); 1106bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallShortMethodA, mid); 110700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 110853b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, 110953b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers args).GetS(); 1110cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1111ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 111272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static void CallVoidMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) { 111372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_list ap; 111472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1115bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallVoidMethod, obj); 1116bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallVoidMethod, mid); 111725e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 11181b09b094a85e03f6ef5f687f58bb91c433273ba1Ian Rogers InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap); 111972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_end(ap); 1120cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1121ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 112272025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static void CallVoidMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) { 1123bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallVoidMethodV, obj); 1124bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallVoidMethodV, mid); 112500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 112600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args); 1127cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1128ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 112972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes static void CallVoidMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) { 1130bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallVoidMethodA, obj); 1131bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallVoidMethodA, mid); 113200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 113353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers InvokeVirtualOrInterfaceWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args); 1134cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1135ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 11361bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jobject CallNonvirtualObjectMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1137cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 113872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1139bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualObjectMethod, obj); 1140bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualObjectMethod, mid); 114125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 114200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 114300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject local_result = soa.AddLocalReference<jobject>(result.GetL()); 1144cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1145cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return local_result; 1146cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1147ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1148bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jobject CallNonvirtualObjectMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1149bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1150bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualObjectMethodV, obj); 1151bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualObjectMethodV, mid); 115200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 115300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, args)); 115400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 1155cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1156ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1157bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jobject CallNonvirtualObjectMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1158bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1159bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualObjectMethodA, obj); 1160bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualObjectMethodA, mid); 116100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 116253b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers JValue result(InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args)); 116300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 1164cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1165ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1166bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jboolean CallNonvirtualBooleanMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1167bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers ...) { 1168cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 116972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1170bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualBooleanMethod, obj); 1171bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualBooleanMethod, mid); 117225e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 117300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1174cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1175f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetZ(); 1176cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1177ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1178bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jboolean CallNonvirtualBooleanMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1179bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1180bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualBooleanMethodV, obj); 1181bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualBooleanMethodV, mid); 118200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 118300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetZ(); 1184cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1185ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1186bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jboolean CallNonvirtualBooleanMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1187bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1188bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualBooleanMethodA, obj); 1189bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualBooleanMethodA, mid); 119000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 119153b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetZ(); 1192cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1193ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 11941bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jbyte CallNonvirtualByteMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1195cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 119672025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1197bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualByteMethod, obj); 1198bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualByteMethod, mid); 119925e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 120000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1201cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1202f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetB(); 1203cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1204ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1205bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jbyte CallNonvirtualByteMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1206bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1207bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualByteMethodV, obj); 1208bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualByteMethodV, mid); 120900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 121000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetB(); 1211cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1212ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1213bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jbyte CallNonvirtualByteMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1214bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1215bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualByteMethodA, obj); 1216bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualByteMethodA, mid); 121700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 121853b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetB(); 1219cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1220ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 12211bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jchar CallNonvirtualCharMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1222cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 122372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1224bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualCharMethod, obj); 1225bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualCharMethod, mid); 1226bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers ScopedObjectAccess soa(env); 122700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1228cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1229f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetC(); 1230cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1231ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1232bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jchar CallNonvirtualCharMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1233bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1234bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualCharMethodV, obj); 1235bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualCharMethodV, mid); 123600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 123700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetC(); 1238cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1239ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1240bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jchar CallNonvirtualCharMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1241bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1242bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualCharMethodA, obj); 1243bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualCharMethodA, mid); 124400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 124553b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetC(); 1246cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1247ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 12481bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jshort CallNonvirtualShortMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1249cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 125072025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1251bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualShortMethod, obj); 1252bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualShortMethod, mid); 125325e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 125400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1255cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1256f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetS(); 1257cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1258ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1259bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jshort CallNonvirtualShortMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1260bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1261bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualShortMethodV, obj); 1262bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualShortMethodV, mid); 126300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 126400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetS(); 1265cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1266ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1267bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jshort CallNonvirtualShortMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1268bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1269bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualShortMethodA, obj); 1270bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualShortMethodA, mid); 127100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 127253b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetS(); 1273cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1274ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 12751bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jint CallNonvirtualIntMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1276cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 127772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1278bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualIntMethod, obj); 1279bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualIntMethod, mid); 128025e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 128100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1282cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1283f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetI(); 1284cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1285ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1286bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jint CallNonvirtualIntMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1287bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1288bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualIntMethodV, obj); 1289bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualIntMethodV, mid); 129000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 129100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetI(); 1292cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1293ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1294bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jint CallNonvirtualIntMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1295bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1296bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualIntMethodA, obj); 1297bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualIntMethodA, mid); 129800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 129953b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetI(); 1300cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1301ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 13021bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jlong CallNonvirtualLongMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1303cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 130472025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1305bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualLongMethod, obj); 1306bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualLongMethod, mid); 130725e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 130800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1309cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1310f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetJ(); 1311cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1312ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1313bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jlong CallNonvirtualLongMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1314bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1315bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualLongMethodV, obj); 1316bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualLongMethodV, mid); 131700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 131800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetJ(); 1319cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1320ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1321bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jlong CallNonvirtualLongMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1322bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1323bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualLongMethodA, obj); 1324bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualLongMethodA, mid); 132500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 132653b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetJ(); 1327cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1328ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 13291bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jfloat CallNonvirtualFloatMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1330cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 133172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1332bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualFloatMethod, obj); 1333bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualFloatMethod, mid); 133425e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 133500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1336cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1337f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetF(); 1338cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1339ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1340bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jfloat CallNonvirtualFloatMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1341bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1342bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualFloatMethodV, obj); 1343bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualFloatMethodV, mid); 134400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 134500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetF(); 1346cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1347ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1348bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jfloat CallNonvirtualFloatMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1349bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1350bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualFloatMethodA, obj); 1351bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualFloatMethodA, mid); 135200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 135353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetF(); 1354cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1355ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 13561bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jdouble CallNonvirtualDoubleMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1357cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 135872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1359bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualDoubleMethod, obj); 1360bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualDoubleMethod, mid); 136125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 136200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JValue result(InvokeWithVarArgs(soa, obj, mid, ap)); 1363cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1364f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetD(); 1365cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1366ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1367bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jdouble CallNonvirtualDoubleMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1368bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers va_list args) { 1369bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualDoubleMethodV, obj); 1370bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualDoubleMethodV, mid); 137100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 137200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return InvokeWithVarArgs(soa, obj, mid, args).GetD(); 1373cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1374ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1375bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jdouble CallNonvirtualDoubleMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1376bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1377bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualDoubleMethodA, obj); 1378bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualDoubleMethodA, mid); 137900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 138053b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers return InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args).GetD(); 1381cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1382ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 13831bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static void CallNonvirtualVoidMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) { 1384cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 138572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1386bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualVoidMethod, obj); 1387bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualVoidMethod, mid); 138825e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 138900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers InvokeWithVarArgs(soa, obj, mid, ap); 1390cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1391cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1392ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1393ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom static void CallNonvirtualVoidMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1394ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom va_list args) { 1395bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualVoidMethodV, obj); 1396bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualVoidMethodV, mid); 139700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 139800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers InvokeWithVarArgs(soa, obj, mid, args); 1399cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1400ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1401bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void CallNonvirtualVoidMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid, 1402bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jvalue* args) { 1403bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualVoidMethodA, obj); 1404bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallNonvirtualVoidMethodA, mid); 140500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 140653b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers InvokeWithJValues(soa, soa.Decode<mirror::Object*>(obj), mid, args); 1407cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1408ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1409bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jfieldID GetFieldID(JNIEnv* env, jclass java_class, const char* name, const char* sig) { 1410bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetFieldID, java_class); 1411bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetFieldID, name); 1412bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetFieldID, sig); 141300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1414bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return FindFieldID(soa, java_class, name, sig, false); 1415cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1416ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1417bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jfieldID GetStaticFieldID(JNIEnv* env, jclass java_class, const char* name, 1418bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const char* sig) { 1419bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStaticFieldID, java_class); 1420bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStaticFieldID, name); 1421bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetFieldID, sig); 142200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1423bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return FindFieldID(soa, java_class, name, sig, true); 1424cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1425ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1426885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jobject GetObjectField(JNIEnv* env, jobject obj, jfieldID fid) { 1427bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetObjectField, obj); 1428bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetObjectField, fid); 142900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1430e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(obj); 1431e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); 143200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(f->GetObject(o)); 1433cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1434ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1435885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jobject GetStaticObjectField(JNIEnv* env, jclass, jfieldID fid) { 1436bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStaticObjectField, fid); 143700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1438e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); 14392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return soa.AddLocalReference<jobject>(f->GetObject(f->GetDeclaringClass())); 1440cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1441ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1442885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetObjectField(JNIEnv* env, jobject java_object, jfieldID fid, jobject java_value) { 1443bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(SetObjectField, java_object); 1444bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(SetObjectField, fid); 144500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1446e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(java_object); 1447e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* v = soa.Decode<mirror::Object*>(java_value); 1448e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); 1449d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz f->SetObject<false>(o, v); 1450cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1451ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1452885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticObjectField(JNIEnv* env, jclass, jfieldID fid, jobject java_value) { 1453bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(SetStaticObjectField, fid); 145400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1455e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* v = soa.Decode<mirror::Object*>(java_value); 1456e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); 1457d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz f->SetObject<false>(f->GetDeclaringClass(), v); 1458cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1459ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1460885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes#define GET_PRIMITIVE_FIELD(fn, instance) \ 1461bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(Get #fn Field, instance); \ 1462bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(Get #fn Field, fid); \ 146300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); \ 1464e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(instance); \ 1465e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); \ 1466bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return f->Get ##fn (o) 1467885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 14682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#define GET_STATIC_PRIMITIVE_FIELD(fn) \ 1469bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStatic #fn Field, fid); \ 14702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ScopedObjectAccess soa(env); \ 1471e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); \ 1472bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return f->Get ##fn (f->GetDeclaringClass()) 14732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 1474885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes#define SET_PRIMITIVE_FIELD(fn, instance, value) \ 1475bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(Set #fn Field, instance); \ 1476bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(Set #fn Field, fid); \ 147700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); \ 1478e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(instance); \ 1479e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); \ 1480d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz f->Set ##fn <false>(o, value) 1481885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 14822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#define SET_STATIC_PRIMITIVE_FIELD(fn, value) \ 1483bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(SetStatic #fn Field, fid); \ 14842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ScopedObjectAccess soa(env); \ 1485e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtField* f = soa.DecodeField(fid); \ 1486d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz f->Set ##fn <false>(f->GetDeclaringClass(), value) 14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 1488885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jboolean GetBooleanField(JNIEnv* env, jobject obj, jfieldID fid) { 1489bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Boolean, obj); 1490cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1491ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1492885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jbyte GetByteField(JNIEnv* env, jobject obj, jfieldID fid) { 1493bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Byte, obj); 1494cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1495ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1496885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jchar GetCharField(JNIEnv* env, jobject obj, jfieldID fid) { 1497bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Char, obj); 1498cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1499ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1500885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jshort GetShortField(JNIEnv* env, jobject obj, jfieldID fid) { 1501bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Short, obj); 1502cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1503ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1504885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jint GetIntField(JNIEnv* env, jobject obj, jfieldID fid) { 1505bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Int, obj); 1506cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1507ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1508885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jlong GetLongField(JNIEnv* env, jobject obj, jfieldID fid) { 1509bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Long, obj); 1510cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1511ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1512885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jfloat GetFloatField(JNIEnv* env, jobject obj, jfieldID fid) { 1513bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Float, obj); 1514cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1515ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1516885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static jdouble GetDoubleField(JNIEnv* env, jobject obj, jfieldID fid) { 1517bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_PRIMITIVE_FIELD(Double, obj); 1518cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1519ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 15201bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jboolean GetStaticBooleanField(JNIEnv* env, jclass, jfieldID fid) { 1521bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Boolean); 1522cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1523ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 15241bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jbyte GetStaticByteField(JNIEnv* env, jclass, jfieldID fid) { 1525bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Byte); 152683ab4f3b4e5544dc78c059e139f20cf93e5c6ce6Carl Shapiro } 1527cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 15281bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jchar GetStaticCharField(JNIEnv* env, jclass, jfieldID fid) { 1529bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Char); 15309b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro } 1531ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 15321bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jshort GetStaticShortField(JNIEnv* env, jclass, jfieldID fid) { 1533bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Short); 1534cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1535ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 15361bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jint GetStaticIntField(JNIEnv* env, jclass, jfieldID fid) { 1537bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Int); 1538cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1539ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 15401bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jlong GetStaticLongField(JNIEnv* env, jclass, jfieldID fid) { 1541bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Long); 1542885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1543885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 15441bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jfloat GetStaticFloatField(JNIEnv* env, jclass, jfieldID fid) { 1545bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Float); 1546885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1547885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 15481bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jdouble GetStaticDoubleField(JNIEnv* env, jclass, jfieldID fid) { 1549bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers GET_STATIC_PRIMITIVE_FIELD(Double); 1550885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1551885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1552885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetBooleanField(JNIEnv* env, jobject obj, jfieldID fid, jboolean v) { 1553bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Boolean, obj, v); 1554885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1555885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1556885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetByteField(JNIEnv* env, jobject obj, jfieldID fid, jbyte v) { 1557bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Byte, obj, v); 1558885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1559885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1560885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetCharField(JNIEnv* env, jobject obj, jfieldID fid, jchar v) { 1561bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Char, obj, v); 1562885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1563885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1564885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetFloatField(JNIEnv* env, jobject obj, jfieldID fid, jfloat v) { 1565bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Float, obj, v); 1566885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1567885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1568885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetDoubleField(JNIEnv* env, jobject obj, jfieldID fid, jdouble v) { 1569bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Double, obj, v); 1570885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1571885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1572885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetIntField(JNIEnv* env, jobject obj, jfieldID fid, jint v) { 1573bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Int, obj, v); 1574885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1575885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1576885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetLongField(JNIEnv* env, jobject obj, jfieldID fid, jlong v) { 1577bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Long, obj, v); 1578885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1579885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1580885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetShortField(JNIEnv* env, jobject obj, jfieldID fid, jshort v) { 1581bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_PRIMITIVE_FIELD(Short, obj, v); 1582885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1583885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1584885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticBooleanField(JNIEnv* env, jclass, jfieldID fid, jboolean v) { 1585bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Boolean, v); 1586885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1587885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1588885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticByteField(JNIEnv* env, jclass, jfieldID fid, jbyte v) { 1589bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Byte, v); 1590885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1591885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1592885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticCharField(JNIEnv* env, jclass, jfieldID fid, jchar v) { 1593bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Char, v); 1594885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1595885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1596885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticFloatField(JNIEnv* env, jclass, jfieldID fid, jfloat v) { 1597bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Float, v); 1598885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1599885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1600885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticDoubleField(JNIEnv* env, jclass, jfieldID fid, jdouble v) { 1601bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Double, v); 1602885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1603885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1604885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticIntField(JNIEnv* env, jclass, jfieldID fid, jint v) { 1605bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Int, v); 1606885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1607885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1608885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticLongField(JNIEnv* env, jclass, jfieldID fid, jlong v) { 1609bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Long, v); 1610885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes } 1611885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes 1612885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes static void SetStaticShortField(JNIEnv* env, jclass, jfieldID fid, jshort v) { 1613bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers SET_STATIC_PRIMITIVE_FIELD(Short, v); 1614cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1615ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16161bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jobject CallStaticObjectMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1617cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 161872025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1619bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticObjectMethod, mid); 162025e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1621e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 162200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject local_result = soa.AddLocalReference<jobject>(result.GetL()); 1623cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1624cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return local_result; 1625cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1626ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16271bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jobject CallStaticObjectMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1628bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticObjectMethodV, mid); 162900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1630e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, args)); 163100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 1632cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1633ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16341bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jobject CallStaticObjectMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1635bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticObjectMethodA, mid); 163600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1637e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithJValues(soa, nullptr, mid, args)); 163800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(result.GetL()); 1639cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1640ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16411bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jboolean CallStaticBooleanMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1642cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 164372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1644bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticBooleanMethod, mid); 164525e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1646e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1647cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1648f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetZ(); 1649cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1650ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16511bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jboolean CallStaticBooleanMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1652bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticBooleanMethodV, mid); 165300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1654e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetZ(); 1655cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1656ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16571bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jboolean CallStaticBooleanMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1658bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticBooleanMethodA, mid); 165900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1660e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetZ(); 1661cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1662ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16631bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jbyte CallStaticByteMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1664cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 166572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1666bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticByteMethod, mid); 166725e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1668e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1669cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1670f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetB(); 1671cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1672ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16731bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jbyte CallStaticByteMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1674bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticByteMethodV, mid); 167500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1676e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetB(); 1677cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1678ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16791bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jbyte CallStaticByteMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1680bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticByteMethodA, mid); 168100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1682e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetB(); 1683cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1684ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16851bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jchar CallStaticCharMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1686cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 168772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1688bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticCharMethod, mid); 168925e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1690e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1691cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1692f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetC(); 1693cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1694ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 16951bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jchar CallStaticCharMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1696bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticCharMethodV, mid); 169700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1698e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetC(); 1699cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1700ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17011bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jchar CallStaticCharMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1702bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticCharMethodA, mid); 170300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1704e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetC(); 1705cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1706ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17071bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jshort CallStaticShortMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1708cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 170972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1710bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticShortMethod, mid); 171125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1712e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1713cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1714f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetS(); 1715cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1716ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17171bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jshort CallStaticShortMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1718bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticShortMethodV, mid); 171900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1720e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetS(); 1721cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1722ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17231bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jshort CallStaticShortMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1724bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticShortMethodA, mid); 172500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1726e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetS(); 1727cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1728ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17291bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jint CallStaticIntMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1730cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 173172025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1732bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticIntMethod, mid); 173325e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1734e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1735cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1736f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetI(); 1737cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1738ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17391bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jint CallStaticIntMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1740bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticIntMethodV, mid); 174100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1742e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetI(); 1743cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1744ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17451bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jint CallStaticIntMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1746bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticIntMethodA, mid); 174700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1748e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetI(); 1749cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1750ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17511bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jlong CallStaticLongMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1752cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 175372025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1754bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticLongMethod, mid); 175525e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1756e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1757cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1758f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetJ(); 1759cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1760ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17611bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jlong CallStaticLongMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1762bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticLongMethodV, mid); 176300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1764e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetJ(); 1765cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1766ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17671bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jlong CallStaticLongMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1768bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticLongMethodA, mid); 176900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1770e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetJ(); 1771cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1772ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17731bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jfloat CallStaticFloatMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1774cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 177572025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1776bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticFloatMethod, mid); 177725e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1778e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1779cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1780f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetF(); 1781cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1782ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17831bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jfloat CallStaticFloatMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1784bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticFloatMethodV, mid); 178500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1786e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetF(); 1787cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1788ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17891bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jfloat CallStaticFloatMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1790bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticFloatMethodA, mid); 179100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1792e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetF(); 1793cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1794ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 17951bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jdouble CallStaticDoubleMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1796cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 179772025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1798bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticDoubleMethod, mid); 179925e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1800e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap)); 1801cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1802f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return result.GetD(); 1803cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1804ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 18051bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jdouble CallStaticDoubleMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1806bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticDoubleMethodV, mid); 180700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1808e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithVarArgs(soa, nullptr, mid, args).GetD(); 1809cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1810ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 18111bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static jdouble CallStaticDoubleMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1812bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticDoubleMethodA, mid); 181300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1814e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return InvokeWithJValues(soa, nullptr, mid, args).GetD(); 1815cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1816ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 18171bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static void CallStaticVoidMethod(JNIEnv* env, jclass, jmethodID mid, ...) { 1818cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_list ap; 181972025e5f8f2743b4af33453df5b3bddada2078dbElliott Hughes va_start(ap, mid); 1820bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticVoidMethod, mid); 182125e8b91db37d9eccc3eed254fe8a340b973d38faIan Rogers ScopedObjectAccess soa(env); 1822e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier InvokeWithVarArgs(soa, nullptr, mid, ap); 1823cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes va_end(ap); 1824cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1825ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 18261bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static void CallStaticVoidMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) { 1827bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticVoidMethodV, mid); 182800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1829e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier InvokeWithVarArgs(soa, nullptr, mid, args); 1830cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1831ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 18321bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes static void CallStaticVoidMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) { 1833bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(CallStaticVoidMethodA, mid); 183400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1835e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier InvokeWithJValues(soa, nullptr, mid, args); 1836cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1837ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1838814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes static jstring NewString(JNIEnv* env, const jchar* chars, jsize char_count) { 18391d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(char_count < 0)) { 18401d99e4549309d05007d041d058b1878de88e9585Ian Rogers JniAbortF("NewString", "char_count < 0: %d", char_count); 18411d99e4549309d05007d041d058b1878de88e9585Ian Rogers return nullptr; 18421d99e4549309d05007d041d058b1878de88e9585Ian Rogers } 18431d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(chars == nullptr && char_count > 0)) { 18441d99e4549309d05007d041d058b1878de88e9585Ian Rogers JniAbortF("NewString", "chars == null && char_count > 0"); 18451d99e4549309d05007d041d058b1878de88e9585Ian Rogers return nullptr; 1846bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers } 184700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1848e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::String* result = mirror::String::AllocFromUtf16(soa.Self(), char_count, chars); 184900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jstring>(result); 1850cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1851ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1852814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes static jstring NewStringUTF(JNIEnv* env, const char* utf) { 1853e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (utf == nullptr) { 1854e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 1855814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes } 185600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1857e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::String* result = mirror::String::AllocFromModifiedUtf8(soa.Self(), utf); 185800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jstring>(result); 1859cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1860ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1861814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes static jsize GetStringLength(JNIEnv* env, jstring java_string) { 1862bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStringLength, java_string); 186300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1864e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return soa.Decode<mirror::String*>(java_string)->GetLength(); 1865814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes } 1866814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 1867814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes static jsize GetStringUTFLength(JNIEnv* env, jstring java_string) { 1868bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStringLength, java_string); 186900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1870e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return soa.Decode<mirror::String*>(java_string)->GetUtfLength(); 1871814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes } 1872814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes 1873bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetStringRegion(JNIEnv* env, jstring java_string, jsize start, jsize length, 1874bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jchar* buf) { 1875bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStringRegion, java_string); 187600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1877e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::String* s = soa.Decode<mirror::String*>(java_string); 1878b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes if (start < 0 || length < 0 || start + length > s->GetLength()) { 187900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowSIOOBE(soa, start, length, s->GetLength()); 1880b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } else { 18814ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringRegion, length, buf); 1882b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes const jchar* chars = s->GetCharArray()->GetData() + s->GetOffset(); 1883b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes memcpy(buf, chars + start, length * sizeof(jchar)); 1884b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 18858a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes } 1886ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1887bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetStringUTFRegion(JNIEnv* env, jstring java_string, jsize start, jsize length, 1888bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers char* buf) { 1889bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetStringUTFRegion, java_string); 189000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1891e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::String* s = soa.Decode<mirror::String*>(java_string); 1892b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes if (start < 0 || length < 0 || start + length > s->GetLength()) { 189300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowSIOOBE(soa, start, length, s->GetLength()); 1894b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } else { 18954ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringUTFRegion, length, buf); 1896b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes const jchar* chars = s->GetCharArray()->GetData() + s->GetOffset(); 1897b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes ConvertUtf16ToModifiedUtf8(buf, chars + start, length); 1898b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 1899cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1900ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 19017577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static const jchar* GetStringChars(JNIEnv* env, jstring java_string, jboolean* is_copy) { 19028e611d32d8bb32681e94af896eb10d6ce6b8485bNarayan Kamath CHECK_NON_NULL_ARGUMENT(GetStringChars, java_string); 190300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1904e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::String* s = soa.Decode<mirror::String*>(java_string); 1905e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::CharArray* chars = s->GetCharArray(); 190600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers PinPrimitiveArray(soa, chars); 1907590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (is_copy != nullptr) { 1908590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier *is_copy = JNI_TRUE; 1909590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 1910590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier int32_t char_count = s->GetLength(); 1911590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier int32_t offset = s->GetOffset(); 1912590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier jchar* bytes = new jchar[char_count + 1]; 1913590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier for (int32_t i = 0; i < char_count; i++) { 1914590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bytes[i] = chars->Get(i + offset); 19157577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 1916590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bytes[char_count] = '\0'; 1917590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return bytes; 1918cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1919ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1920590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseStringChars(JNIEnv* env, jstring java_string, const jchar* chars) { 19218e611d32d8bb32681e94af896eb10d6ce6b8485bNarayan Kamath CHECK_NON_NULL_ARGUMENT(ReleaseStringChars, java_string); 1922590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier delete[] chars; 192300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1924e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier UnpinPrimitiveArray(soa, soa.Decode<mirror::String*>(java_string)->GetCharArray()); 1925cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1926ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 19277577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static const jchar* GetStringCritical(JNIEnv* env, jstring java_string, jboolean* is_copy) { 19287577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes return GetStringChars(env, java_string, is_copy); 1929cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1930ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 19317577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static void ReleaseStringCritical(JNIEnv* env, jstring java_string, const jchar* chars) { 19327577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes return ReleaseStringChars(env, java_string, chars); 1933cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1934ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 19357577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static const char* GetStringUTFChars(JNIEnv* env, jstring java_string, jboolean* is_copy) { 1936e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (java_string == nullptr) { 1937e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return nullptr; 19387577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 1939e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (is_copy != nullptr) { 19407577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes *is_copy = JNI_TRUE; 19417577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 1942ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers ScopedObjectAccess soa(env); 1943e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::String* s = soa.Decode<mirror::String*>(java_string); 19447577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes size_t byte_count = s->GetUtfLength(); 19457577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes char* bytes = new char[byte_count + 1]; 1946e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier CHECK(bytes != nullptr); // bionic aborts anyway. 19477577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes const uint16_t* chars = s->GetCharArray()->GetData() + s->GetOffset(); 19487577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes ConvertUtf16ToModifiedUtf8(bytes, chars, s->GetLength()); 19497577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes bytes[byte_count] = '\0'; 19507577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes return bytes; 1951b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 1952b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 19537577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static void ReleaseStringUTFChars(JNIEnv* env, jstring, const char* chars) { 19547577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes delete[] chars; 1955b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 1956b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 1957bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes static jsize GetArrayLength(JNIEnv* env, jarray java_array) { 1958bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetArrayLength, java_array); 195900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1960e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(java_array); 1961ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom if (UNLIKELY(!obj->IsArrayInstance())) { 196296a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes JniAbortF("GetArrayLength", "not an array: %s", PrettyTypeOf(obj).c_str()); 196396a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes } 1964e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Array* array = obj->AsArray(); 1965bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes return array->GetLength(); 1966cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1967ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1968814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes static jobject GetObjectArrayElement(JNIEnv* env, jobjectArray java_array, jsize index) { 1969bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetObjectArrayElement, java_array); 197000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1971e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ObjectArray<mirror::Object>* array = 1972e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier soa.Decode<mirror::ObjectArray<mirror::Object>*>(java_array); 197300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(array->Get(index)); 1974cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1975d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes 1976bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetObjectArrayElement(JNIEnv* env, jobjectArray java_array, jsize index, 1977bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jobject java_value) { 1978bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(SetObjectArrayElement, java_array); 197900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1980e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ObjectArray<mirror::Object>* array = 1981e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier soa.Decode<mirror::ObjectArray<mirror::Object>*>(java_array); 1982e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* value = soa.Decode<mirror::Object*>(java_value); 1983d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->Set<false>(index, value); 1984cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1985f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 1986cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jbooleanArray NewBooleanArray(JNIEnv* env, jsize length) { 198700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1988e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jbooleanArray, mirror::BooleanArray>(soa, length); 1989cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1990ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1991cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jbyteArray NewByteArray(JNIEnv* env, jsize length) { 199200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1993e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jbyteArray, mirror::ByteArray>(soa, length); 1994cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 1995ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 1996cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jcharArray NewCharArray(JNIEnv* env, jsize length) { 199700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 1998e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jcharArray, mirror::CharArray>(soa, length); 1999cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2000ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2001cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jdoubleArray NewDoubleArray(JNIEnv* env, jsize length) { 200200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2003e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jdoubleArray, mirror::DoubleArray>(soa, length); 2004cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2005ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2006cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jfloatArray NewFloatArray(JNIEnv* env, jsize length) { 200700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2008e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jfloatArray, mirror::FloatArray>(soa, length); 2009cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2010ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2011cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jintArray NewIntArray(JNIEnv* env, jsize length) { 201200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2013e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jintArray, mirror::IntArray>(soa, length); 2014cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2015ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2016cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jlongArray NewLongArray(JNIEnv* env, jsize length) { 201700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2018e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jlongArray, mirror::LongArray>(soa, length); 2019cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2020f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 20211d99e4549309d05007d041d058b1878de88e9585Ian Rogers static jobjectArray NewObjectArray(JNIEnv* env, jsize length, jclass element_jclass, 20221d99e4549309d05007d041d058b1878de88e9585Ian Rogers jobject initial_element) { 20231d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(length < 0)) { 202496a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes JniAbortF("NewObjectArray", "negative array length: %d", length); 20251d99e4549309d05007d041d058b1878de88e9585Ian Rogers return nullptr; 202696a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes } 2027cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 2028cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Compute the array class corresponding to the given element class. 2029ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ScopedObjectAccess soa(env); 2030e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* array_class; 20311d99e4549309d05007d041d058b1878de88e9585Ian Rogers { 2032e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* element_class = soa.Decode<mirror::Class*>(element_jclass); 20331d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(element_class->IsPrimitive())) { 20341d99e4549309d05007d041d058b1878de88e9585Ian Rogers JniAbortF("NewObjectArray", "not an object type: %s", 20351d99e4549309d05007d041d058b1878de88e9585Ian Rogers PrettyDescriptor(element_class).c_str()); 20361d99e4549309d05007d041d058b1878de88e9585Ian Rogers return nullptr; 20371d99e4549309d05007d041d058b1878de88e9585Ian Rogers } 20381d99e4549309d05007d041d058b1878de88e9585Ian Rogers ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 20399837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers array_class = class_linker->FindArrayClass(soa.Self(), element_class); 20401d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(array_class == nullptr)) { 20411d99e4549309d05007d041d058b1878de88e9585Ian Rogers return nullptr; 20421d99e4549309d05007d041d058b1878de88e9585Ian Rogers } 2043cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2044cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 20457577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes // Allocate and initialize if necessary. 2046e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ObjectArray<mirror::Object>* result = 2047e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(), array_class, length); 20481d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (result != nullptr && initial_element != nullptr) { 2049e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* initial_object = soa.Decode<mirror::Object*>(initial_element); 20501d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (initial_object != nullptr) { 20511d99e4549309d05007d041d058b1878de88e9585Ian Rogers mirror::Class* element_class = result->GetClass()->GetComponentType(); 20521d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(!element_class->IsAssignableFrom(initial_object->GetClass()))) { 20531d99e4549309d05007d041d058b1878de88e9585Ian Rogers JniAbortF("NewObjectArray", "cannot assign object of type '%s' to array with element " 20541d99e4549309d05007d041d058b1878de88e9585Ian Rogers "type of '%s'", PrettyDescriptor(initial_object->GetClass()).c_str(), 20551d99e4549309d05007d041d058b1878de88e9585Ian Rogers PrettyDescriptor(element_class).c_str()); 20561d99e4549309d05007d041d058b1878de88e9585Ian Rogers 20571d99e4549309d05007d041d058b1878de88e9585Ian Rogers } else { 20581d99e4549309d05007d041d058b1878de88e9585Ian Rogers for (jsize i = 0; i < length; ++i) { 2059d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz result->SetWithoutChecks<false>(i, initial_object); 20601d99e4549309d05007d041d058b1878de88e9585Ian Rogers } 20611d99e4549309d05007d041d058b1878de88e9585Ian Rogers } 20627577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 20637577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes } 206400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobjectArray>(result); 2065f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes } 2066f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 2067cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jshortArray NewShortArray(JNIEnv* env, jsize length) { 206800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2069e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return NewPrimitiveArray<jshortArray, mirror::ShortArray>(soa, length); 2070cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2071ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2072a15e67d5ee5aa9615596cee2be42c2b2caf128c6Ian Rogers static void* GetPrimitiveArrayCritical(JNIEnv* env, jarray java_array, jboolean* is_copy) { 2073bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetPrimitiveArrayCritical, java_array); 207400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2075e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Array* array = soa.Decode<mirror::Array*>(java_array); 2076590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier gc::Heap* heap = Runtime::Current()->GetHeap(); 2077590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (heap->IsMovableObject(array)) { 20781d27b34d3b18a5a0c832dae9768366dc08ef8d1cMathieu Chartier heap->IncrementDisableMovingGC(soa.Self()); 2079590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Re-decode in case the object moved since IncrementDisableGC waits for GC to complete. 2080e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier array = soa.Decode<mirror::Array*>(java_array); 2081590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 208200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers PinPrimitiveArray(soa, array); 2083590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (is_copy != nullptr) { 2084a15e67d5ee5aa9615596cee2be42c2b2caf128c6Ian Rogers *is_copy = JNI_FALSE; 2085a15e67d5ee5aa9615596cee2be42c2b2caf128c6Ian Rogers } 2086ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return array->GetRawData(array->GetClass()->GetComponentSize(), 0); 2087b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 2088b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 2089590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* elements, jint mode) { 2090bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(ReleasePrimitiveArrayCritical, array); 2091590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2092b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 2093b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 20947577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jboolean* GetBooleanArrayElements(JNIEnv* env, jbooleanArray array, jboolean* is_copy) { 2095bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetBooleanArrayElements, array); 209600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2097e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jbooleanArray, jboolean*, mirror::BooleanArray>(soa, array, is_copy); 2098cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2099ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21007577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jbyte* GetByteArrayElements(JNIEnv* env, jbyteArray array, jboolean* is_copy) { 2101bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetByteArrayElements, array); 210200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2103e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jbyteArray, jbyte*, mirror::ByteArray>(soa, array, is_copy); 2104cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2105ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21067577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jchar* GetCharArrayElements(JNIEnv* env, jcharArray array, jboolean* is_copy) { 2107bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetCharArrayElements, array); 210800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2109e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jcharArray, jchar*, mirror::CharArray>(soa, array, is_copy); 2110cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2111ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21127577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jdouble* GetDoubleArrayElements(JNIEnv* env, jdoubleArray array, jboolean* is_copy) { 2113bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetDoubleArrayElements, array); 211400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2115e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jdoubleArray, jdouble*, mirror::DoubleArray>(soa, array, is_copy); 2116cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2117ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21187577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jfloat* GetFloatArrayElements(JNIEnv* env, jfloatArray array, jboolean* is_copy) { 2119bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetFloatArrayElements, array); 212000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2121e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jfloatArray, jfloat*, mirror::FloatArray>(soa, array, is_copy); 2122cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2123ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21247577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jint* GetIntArrayElements(JNIEnv* env, jintArray array, jboolean* is_copy) { 2125bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetIntArrayElements, array); 212600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2127e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jintArray, jint*, mirror::IntArray>(soa, array, is_copy); 2128cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2129ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21307577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jlong* GetLongArrayElements(JNIEnv* env, jlongArray array, jboolean* is_copy) { 2131bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetLongArrayElements, array); 213200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2133e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jlongArray, jlong*, mirror::LongArray>(soa, array, is_copy); 2134cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2135ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 21367577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes static jshort* GetShortArrayElements(JNIEnv* env, jshortArray array, jboolean* is_copy) { 2137bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetShortArrayElements, array); 213800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2139e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return GetPrimitiveArray<jshortArray, jshort*, mirror::ShortArray>(soa, array, is_copy); 2140cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2141ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2142590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseBooleanArrayElements(JNIEnv* env, jbooleanArray array, jboolean* elements, 2143590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier jint mode) { 2144590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2145cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2146ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2147590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseByteArrayElements(JNIEnv* env, jbyteArray array, jbyte* elements, jint mode) { 2148590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2149cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2150ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2151590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseCharArrayElements(JNIEnv* env, jcharArray array, jchar* elements, jint mode) { 2152590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2153cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2154ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2155590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseDoubleArrayElements(JNIEnv* env, jdoubleArray array, jdouble* elements, 2156590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier jint mode) { 2157590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2158cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2159ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2160590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseFloatArrayElements(JNIEnv* env, jfloatArray array, jfloat* elements, 2161590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier jint mode) { 2162590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2163cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2164ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2165590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseIntArrayElements(JNIEnv* env, jintArray array, jint* elements, jint mode) { 2166590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2167cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2168ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2169590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseLongArrayElements(JNIEnv* env, jlongArray array, jlong* elements, jint mode) { 2170590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2171cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2172ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2173590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleaseShortArrayElements(JNIEnv* env, jshortArray array, jshort* elements, 2174590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier jint mode) { 2175590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ReleasePrimitiveArray(env, array, elements, mode); 2176cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2177ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2178bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize length, 2179bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jboolean* buf) { 218000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2181e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jbooleanArray, jboolean, mirror::BooleanArray>(soa, array, start, 2182e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier length, buf); 2183cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2184ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2185bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize length, 2186bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jbyte* buf) { 218700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2188e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jbyteArray, jbyte, mirror::ByteArray>(soa, array, start, length, buf); 2189cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2190ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2191bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize length, 2192bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jchar* buf) { 219300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2194e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jcharArray, jchar, mirror::CharArray>(soa, array, start, length, buf); 2195cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2196ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2197bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize length, 2198bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jdouble* buf) { 219900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2200e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jdoubleArray, jdouble, mirror::DoubleArray>(soa, array, start, length, 2201e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier buf); 2202cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2203ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2204bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize length, 2205bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jfloat* buf) { 220600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2207e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jfloatArray, jfloat, mirror::FloatArray>(soa, array, start, length, 2208e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier buf); 2209cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2210ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2211bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize length, 2212bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jint* buf) { 221300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2214e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jintArray, jint, mirror::IntArray>(soa, array, start, length, buf); 2215cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2216ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2217bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize length, 2218bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jlong* buf) { 221900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2220e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jlongArray, jlong, mirror::LongArray>(soa, array, start, length, buf); 2221cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2222ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2223bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize length, 2224bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jshort* buf) { 222500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2226e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier GetPrimitiveArrayRegion<jshortArray, jshort, mirror::ShortArray>(soa, array, start, length, 2227e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier buf); 2228cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2229ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2230bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize length, 2231bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jboolean* buf) { 223200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2233491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom SetPrimitiveArrayRegion<jbooleanArray, jboolean, mirror::BooleanArray>(soa, array, start, 2234491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom length, buf); 2235cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2236ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2237bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize length, 2238bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jbyte* buf) { 223900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2240e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetPrimitiveArrayRegion<jbyteArray, jbyte, mirror::ByteArray>(soa, array, start, length, buf); 2241cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2242ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2243bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize length, 2244bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jchar* buf) { 224500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2246e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetPrimitiveArrayRegion<jcharArray, jchar, mirror::CharArray>(soa, array, start, length, buf); 2247cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2248ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2249bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize length, 2250bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jdouble* buf) { 225100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2252491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom SetPrimitiveArrayRegion<jdoubleArray, jdouble, mirror::DoubleArray>(soa, array, start, length, 2253491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom buf); 2254cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2255ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2256bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize length, 2257bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jfloat* buf) { 225800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2259491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom SetPrimitiveArrayRegion<jfloatArray, jfloat, mirror::FloatArray>(soa, array, start, length, 2260491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom buf); 2261cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2262ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2263bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize length, 2264bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jint* buf) { 226500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2266e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetPrimitiveArrayRegion<jintArray, jint, mirror::IntArray>(soa, array, start, length, buf); 2267cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2268ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2269bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize length, 2270bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jlong* buf) { 227100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2272e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetPrimitiveArrayRegion<jlongArray, jlong, mirror::LongArray>(soa, array, start, length, buf); 2273cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2274ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2275bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static void SetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize length, 2276bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers const jshort* buf) { 227700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2278e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SetPrimitiveArrayRegion<jshortArray, jshort, mirror::ShortArray>(soa, array, start, length, 2279e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier buf); 2280cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2281ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2282bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jint RegisterNatives(JNIEnv* env, jclass java_class, const JNINativeMethod* methods, 2283bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jint method_count) { 2284c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes return RegisterNativeMethods(env, java_class, methods, method_count, true); 2285c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes } 2286c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes 2287bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers static jint RegisterNativeMethods(JNIEnv* env, jclass java_class, const JNINativeMethod* methods, 2288bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jint method_count, bool return_errors) { 2289bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers if (UNLIKELY(method_count < 0)) { 2290aa836f7fa2ef359cf8ec1ef98d924f7971ba8352Elliott Hughes JniAbortF("RegisterNatives", "negative method count: %d", method_count); 2291bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return JNI_ERR; // Not reached. 2292bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers } 2293bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(RegisterNatives, java_class); 229400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2295e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = soa.Decode<mirror::Class*>(java_class); 2296bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers if (UNLIKELY(method_count == 0)) { 2297bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers LOG(WARNING) << "JNI RegisterNativeMethods: attempt to register 0 native methods for " 2298bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers << PrettyDescriptor(c); 2299bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers return JNI_OK; 2300bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers } 2301bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(RegisterNatives, methods); 2302bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers for (jint i = 0; i < method_count; ++i) { 2303cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes const char* name = methods[i].name; 2304cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes const char* sig = methods[i].signature; 23051eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers bool is_fast = false; 2306cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes if (*sig == '!') { 23071eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers is_fast = true; 2308cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes ++sig; 2309cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 23100af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes 2311e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtMethod* m = c->FindDirectMethod(name, sig); 2312e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (m == nullptr) { 23135174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes m = c->FindVirtualMethod(name, sig); 2314cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2315e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (m == nullptr) { 23160177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers c->DumpClass(LOG(ERROR), mirror::Class::kDumpClassFullDetail); 2317c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes LOG(return_errors ? ERROR : FATAL) << "Failed to register native method " 23180177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers << PrettyDescriptor(c) << "." << name << sig << " in " 23190177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers << c->GetDexCache()->GetLocation()->ToModifiedUtf8(); 232000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowNoSuchMethodError(soa, c, name, sig, "static or non-static"); 2321cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_ERR; 23225174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes } else if (!m->IsNative()) { 2323c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes LOG(return_errors ? ERROR : FATAL) << "Failed to register non-native method " 2324bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers << PrettyDescriptor(c) << "." << name << sig 2325bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers << " as native"; 232600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowNoSuchMethodError(soa, c, name, sig, "native"); 2327cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_ERR; 2328cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 23295174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 23304dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes VLOG(jni) << "[Registering JNI native method " << PrettyMethod(m) << "]"; 23315174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 23321eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers m->RegisterNative(soa.Self(), methods[i].fnPtr, is_fast); 23334dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 2334cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_OK; 23354dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers } 2336ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 23375174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes static jint UnregisterNatives(JNIEnv* env, jclass java_class) { 2338bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(UnregisterNatives, java_class); 233900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2340e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = soa.Decode<mirror::Class*>(java_class); 23415174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 23424dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes VLOG(jni) << "[Unregistering JNI native methods for " << PrettyClass(c) << "]"; 23435174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 23445174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes for (size_t i = 0; i < c->NumDirectMethods(); ++i) { 2345e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtMethod* m = c->GetDirectMethod(i); 23465174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes if (m->IsNative()) { 234700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers m->UnregisterNative(soa.Self()); 23485174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes } 23495174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes } 23505174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes for (size_t i = 0; i < c->NumVirtualMethods(); ++i) { 2351e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::ArtMethod* m = c->GetVirtualMethod(i); 23525174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes if (m->IsNative()) { 235300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers m->UnregisterNative(soa.Self()); 23545174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes } 23555174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes } 23565174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes 23575174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes return JNI_OK; 2358cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2359ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2360719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers static jint MonitorEnter(JNIEnv* env, jobject java_object) NO_THREAD_SAFETY_ANALYSIS { 2361bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(MonitorEnter, java_object); 236200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2363e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(java_object); 2364e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier o = o->MonitorEnter(soa.Self()); 236500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (soa.Self()->IsExceptionPending()) { 2366ab7b9dcbfc4264a0bc4889c3e463ff88a67f6a30Elliott Hughes return JNI_ERR; 2367ab7b9dcbfc4264a0bc4889c3e463ff88a67f6a30Elliott Hughes } 236800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers soa.Env()->monitors.Add(o); 2369ab7b9dcbfc4264a0bc4889c3e463ff88a67f6a30Elliott Hughes return JNI_OK; 2370cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2371ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2372719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers static jint MonitorExit(JNIEnv* env, jobject java_object) NO_THREAD_SAFETY_ANALYSIS { 2373bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(MonitorExit, java_object); 237400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(env); 2375e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Object* o = soa.Decode<mirror::Object*>(java_object); 237600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers o->MonitorExit(soa.Self()); 237700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (soa.Self()->IsExceptionPending()) { 2378ab7b9dcbfc4264a0bc4889c3e463ff88a67f6a30Elliott Hughes return JNI_ERR; 2379ab7b9dcbfc4264a0bc4889c3e463ff88a67f6a30Elliott Hughes } 238000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers soa.Env()->monitors.Remove(o); 2381ab7b9dcbfc4264a0bc4889c3e463ff88a67f6a30Elliott Hughes return JNI_OK; 2382f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes } 2383ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2384cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jint GetJavaVM(JNIEnv* env, JavaVM** vm) { 2385bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetJavaVM, vm); 2386cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes Runtime* runtime = Runtime::Current(); 2387e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (runtime != nullptr) { 238869f5bc6759f256a146eefd8a7141d39fcc3b0421Elliott Hughes *vm = runtime->GetJavaVM(); 2389cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } else { 2390e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier *vm = nullptr; 2391cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2392e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return (*vm != nullptr) ? JNI_OK : JNI_ERR; 2393cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2394ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2395b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes static jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) { 239696a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes if (capacity < 0) { 2397ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers JniAbortF("NewDirectByteBuffer", "negative buffer capacity: %" PRId64, capacity); 239896a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes } 2399e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (address == nullptr && capacity != 0) { 2400e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier JniAbortF("NewDirectByteBuffer", "non-zero capacity for nullptr pointer: %" PRId64, capacity); 240196a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes } 2402ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2403936b37f3a7f224d990a36b2ec66782a4462180d6Ian Rogers // At the moment, the capacity is limited to 32 bits. 2404b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes CHECK_LE(capacity, 0xffffffff); 2405b56812165dd3a2e6eb8b85c810943b3d7bd9bfc4Elliott Hughes jlong address_arg = reinterpret_cast<jlong>(address); 2406b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes jint capacity_arg = static_cast<jint>(capacity); 2407ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2408aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott Hughes jobject result = env->NewObject(WellKnownClasses::java_nio_DirectByteBuffer, 2409aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott Hughes WellKnownClasses::java_nio_DirectByteBuffer_init, 2410eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes address_arg, capacity_arg); 2411e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return static_cast<JNIEnvExt*>(env)->self->IsExceptionPending() ? nullptr : result; 2412cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2413ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2414b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes static void* GetDirectBufferAddress(JNIEnv* env, jobject java_buffer) { 2415e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return reinterpret_cast<void*>(env->GetLongField( 2416e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier java_buffer, WellKnownClasses::java_nio_DirectByteBuffer_effectiveDirectAddress)); 2417cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2418ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2419b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes static jlong GetDirectBufferCapacity(JNIEnv* env, jobject java_buffer) { 2420e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return static_cast<jlong>(env->GetIntField( 2421e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier java_buffer, WellKnownClasses::java_nio_DirectByteBuffer_capacity)); 2422cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2423ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2424b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes static jobjectRefType GetObjectRefType(JNIEnv* env, jobject java_object) { 2425bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetObjectRefType, java_object); 2426b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 2427b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes // Do we definitely know what kind of reference this is? 2428b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes IndirectRef ref = reinterpret_cast<IndirectRef>(java_object); 2429b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes IndirectRefKind kind = GetIndirectRefKind(ref); 2430b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes switch (kind) { 2431c645f1ddb7c40bea6a38eda4b3f83f6b6dec405bMathieu Chartier case kLocal: { 2432c645f1ddb7c40bea6a38eda4b3f83f6b6dec405bMathieu Chartier ScopedObjectAccess soa(env); 2433ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers if (static_cast<JNIEnvExt*>(env)->locals.Get(ref) != kInvalidIndirectRefObject) { 24342ced6a534157d5d963693346904389c19775d2daElliott Hughes return JNILocalRefType; 24352ced6a534157d5d963693346904389c19775d2daElliott Hughes } 24362ced6a534157d5d963693346904389c19775d2daElliott Hughes return JNIInvalidRefType; 2437c645f1ddb7c40bea6a38eda4b3f83f6b6dec405bMathieu Chartier } 2438b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case kGlobal: 2439b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return JNIGlobalRefType; 2440b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case kWeakGlobal: 2441b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return JNIWeakGlobalRefType; 2442b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case kSirtOrInvalid: 2443b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes // Is it in a stack IRT? 2444ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers if (static_cast<JNIEnvExt*>(env)->self->SirtContains(java_object)) { 2445b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return JNILocalRefType; 2446b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 2447b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 2448ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers if (!static_cast<JNIEnvExt*>(env)->vm->work_around_app_jni_bugs) { 2449c5bfa8f49d8548d7c685a99b411311ef56bedffaElliott Hughes return JNIInvalidRefType; 2450c5bfa8f49d8548d7c685a99b411311ef56bedffaElliott Hughes } 2451c5bfa8f49d8548d7c685a99b411311ef56bedffaElliott Hughes 2452e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier // If we're handing out direct pointers, check whether it's a direct pointer to a local 2453e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier // reference. 2454ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers { 2455ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers ScopedObjectAccess soa(env); 2456e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (soa.Decode<mirror::Object*>(java_object) == 2457e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier reinterpret_cast<mirror::Object*>(java_object)) { 2458491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom mirror::Object* object = reinterpret_cast<mirror::Object*>(java_object); 2459491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom if (soa.Env()->locals.ContainsDirectPointer(object)) { 2460ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers return JNILocalRefType; 2461ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers } 2462b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 2463b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 2464b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return JNIInvalidRefType; 2465b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 24662e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom LOG(FATAL) << "IndirectRefKind[" << kind << "]"; 24672e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom return JNIInvalidRefType; 2468cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 246900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 247000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers private: 2471ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers static jint EnsureLocalCapacity(JNIEnv* env, jint desired_capacity, 2472ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers const char* caller) { 247300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // TODO: we should try to expand the table if necessary. 2474aa836f7fa2ef359cf8ec1ef98d924f7971ba8352Elliott Hughes if (desired_capacity < 0 || desired_capacity > static_cast<jint>(kLocalsMax)) { 247500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOG(ERROR) << "Invalid capacity given to " << caller << ": " << desired_capacity; 247600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return JNI_ERR; 247700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 247800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // TODO: this isn't quite right, since "capacity" includes holes. 2479ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers size_t capacity = static_cast<JNIEnvExt*>(env)->locals.Capacity(); 248000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers bool okay = (static_cast<jint>(kLocalsMax - capacity) >= desired_capacity); 248100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (!okay) { 2482ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers ScopedObjectAccess soa(env); 248300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers soa.Self()->ThrowOutOfMemoryError(caller); 248400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 248500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return okay ? JNI_OK : JNI_ERR; 248600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 248700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 248800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers template<typename JniT, typename ArtT> 248900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers static JniT NewPrimitiveArray(const ScopedObjectAccess& soa, jsize length) 2490b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 24911d99e4549309d05007d041d058b1878de88e9585Ian Rogers if (UNLIKELY(length < 0)) { 249296a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes JniAbortF("NewPrimitiveArray", "negative array length: %d", length); 24931d99e4549309d05007d041d058b1878de88e9585Ian Rogers return nullptr; 249496a9887f0bc912661e0a7478c7eb19847d2e2e06Elliott Hughes } 249550b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers ArtT* result = ArtT::Alloc(soa.Self(), length); 249600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<JniT>(result); 249700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 249800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 249900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers template <typename ArrayT, typename CArrayT, typename ArtArrayT> 250000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers static CArrayT GetPrimitiveArray(ScopedObjectAccess& soa, ArrayT java_array, 250100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jboolean* is_copy) 2502b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 250300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ArtArrayT* array = soa.Decode<ArtArrayT*>(java_array); 250400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers PinPrimitiveArray(soa, array); 2505590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Only make a copy if necessary. 2506590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (Runtime::Current()->GetHeap()->IsMovableObject(array)) { 2507590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (is_copy != nullptr) { 2508590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier *is_copy = JNI_TRUE; 2509590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 2510590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static const size_t component_size = array->GetClass()->GetComponentSize(); 2511590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t size = array->GetLength() * component_size; 2512590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier void* data = new uint64_t[RoundUp(size, 8) / 8]; 2513590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier memcpy(data, array->GetData(), size); 2514590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return reinterpret_cast<CArrayT>(data); 2515590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } else { 2516590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (is_copy != nullptr) { 2517590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier *is_copy = JNI_FALSE; 2518590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 2519590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return reinterpret_cast<CArrayT>(array->GetData()); 252000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 252100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 252200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 2523590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier template <typename ArrayT, typename ElementT> 2524590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier static void ReleasePrimitiveArray(JNIEnv* env, ArrayT java_array, ElementT* elements, jint mode) { 2525590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ScopedObjectAccess soa(env); 2526e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Array* array = soa.Decode<mirror::Array*>(java_array); 2527590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t component_size = array->GetClass()->GetComponentSize(); 2528ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void* array_data = array->GetRawData(component_size, 0); 2529590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier gc::Heap* heap = Runtime::Current()->GetHeap(); 2530590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool is_copy = array_data != reinterpret_cast<void*>(elements); 2531590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t bytes = array->GetLength() * component_size; 2532590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier VLOG(heap) << "Release primitive array " << env << " array_data " << array_data 2533590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier << " elements " << reinterpret_cast<void*>(elements); 2534d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier if (is_copy) { 2535d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier // Sanity check: If elements is not the same as the java array's data, it better not be a 2536d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier // heap address. TODO: This might be slow to check, may be worth keeping track of which 2537d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier // copies we make? 2538d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier if (heap->IsNonDiscontinuousSpaceHeapAddress(reinterpret_cast<mirror::Object*>(elements))) { 2539d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier JniAbortF("ReleaseArrayElements", "invalid element pointer %p, array elements are %p", 2540d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier reinterpret_cast<void*>(elements), array_data); 2541d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier return; 2542d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier } 2543d68ac700820f3e4253c8b4bcf718daf452f6da4cMathieu Chartier } 2544590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Don't need to copy if we had a direct pointer. 2545590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (mode != JNI_ABORT && is_copy) { 2546590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier memcpy(array_data, elements, bytes); 2547590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 254800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (mode != JNI_COMMIT) { 2549590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (is_copy) { 2550590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier delete[] reinterpret_cast<uint64_t*>(elements); 25513e8b2e1f14176c6beb61a31a27af30bc35998e80Mathieu Chartier } else if (heap->IsMovableObject(array)) { 25521d27b34d3b18a5a0c832dae9768366dc08ef8d1cMathieu Chartier // Non copy to a movable object must means that we had disabled the moving GC. 25531d27b34d3b18a5a0c832dae9768366dc08ef8d1cMathieu Chartier heap->DecrementDisableMovingGC(soa.Self()); 2554590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 25553e8b2e1f14176c6beb61a31a27af30bc35998e80Mathieu Chartier UnpinPrimitiveArray(soa, array); 255600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 255700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 255800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 255900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers template <typename JavaArrayT, typename JavaT, typename ArrayT> 256000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers static void GetPrimitiveArrayRegion(ScopedObjectAccess& soa, JavaArrayT java_array, 256100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jsize start, jsize length, JavaT* buf) 2562b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 2563bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(GetPrimitiveArrayRegion, java_array); 256400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ArrayT* array = soa.Decode<ArrayT*>(java_array); 256500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (start < 0 || length < 0 || start + length > array->GetLength()) { 256600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowAIOOBE(soa, array, start, length, "src"); 256700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } else { 25684ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringRegion, length, buf); 256900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JavaT* data = array->GetData(); 257000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers memcpy(buf, data + start, length * sizeof(JavaT)); 257100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 257200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 257300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 257400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers template <typename JavaArrayT, typename JavaT, typename ArrayT> 257500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers static void SetPrimitiveArrayRegion(ScopedObjectAccess& soa, JavaArrayT java_array, 257600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jsize start, jsize length, const JavaT* buf) 2577b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 2578bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers CHECK_NON_NULL_ARGUMENT(SetPrimitiveArrayRegion, java_array); 257900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ArrayT* array = soa.Decode<ArrayT*>(java_array); 258000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (start < 0 || length < 0 || start + length > array->GetLength()) { 258100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ThrowAIOOBE(soa, array, start, length, "dst"); 258200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } else { 25834ffdc6bd962c37bca407267c0858b37bb18a9857Ian Rogers CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringRegion, length, buf); 258400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers JavaT* data = array->GetData(); 258500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers memcpy(data + start, buf, length * sizeof(JavaT)); 258600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 258700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 2588cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes}; 2589ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 259088c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughesconst JNINativeInterface gJniNativeInterface = { 2591e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved0. 2592e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved1. 2593e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved2. 2594e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved3. 2595cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetVersion, 2596cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::DefineClass, 2597cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::FindClass, 2598cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::FromReflectedMethod, 2599cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::FromReflectedField, 2600cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ToReflectedMethod, 2601cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetSuperclass, 2602cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::IsAssignableFrom, 2603cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ToReflectedField, 2604cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::Throw, 2605cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ThrowNew, 2606cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ExceptionOccurred, 2607cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ExceptionDescribe, 2608cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ExceptionClear, 2609cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::FatalError, 2610cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::PushLocalFrame, 2611cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::PopLocalFrame, 2612cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewGlobalRef, 2613cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::DeleteGlobalRef, 2614cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::DeleteLocalRef, 2615cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::IsSameObject, 2616cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewLocalRef, 2617cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::EnsureLocalCapacity, 2618cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::AllocObject, 2619cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewObject, 2620cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewObjectV, 2621cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewObjectA, 2622cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetObjectClass, 2623cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::IsInstanceOf, 2624cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetMethodID, 2625cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallObjectMethod, 2626cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallObjectMethodV, 2627cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallObjectMethodA, 2628cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallBooleanMethod, 2629cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallBooleanMethodV, 2630cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallBooleanMethodA, 2631cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallByteMethod, 2632cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallByteMethodV, 2633cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallByteMethodA, 2634cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallCharMethod, 2635cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallCharMethodV, 2636cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallCharMethodA, 2637cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallShortMethod, 2638cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallShortMethodV, 2639cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallShortMethodA, 2640cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallIntMethod, 2641cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallIntMethodV, 2642cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallIntMethodA, 2643cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallLongMethod, 2644cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallLongMethodV, 2645cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallLongMethodA, 2646cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallFloatMethod, 2647cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallFloatMethodV, 2648cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallFloatMethodA, 2649cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallDoubleMethod, 2650cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallDoubleMethodV, 2651cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallDoubleMethodA, 2652cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallVoidMethod, 2653cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallVoidMethodV, 2654cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallVoidMethodA, 2655cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualObjectMethod, 2656cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualObjectMethodV, 2657cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualObjectMethodA, 2658cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualBooleanMethod, 2659cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualBooleanMethodV, 2660cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualBooleanMethodA, 2661cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualByteMethod, 2662cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualByteMethodV, 2663cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualByteMethodA, 2664cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualCharMethod, 2665cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualCharMethodV, 2666cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualCharMethodA, 2667cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualShortMethod, 2668cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualShortMethodV, 2669cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualShortMethodA, 2670cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualIntMethod, 2671cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualIntMethodV, 2672cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualIntMethodA, 2673cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualLongMethod, 2674cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualLongMethodV, 2675cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualLongMethodA, 2676cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualFloatMethod, 2677cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualFloatMethodV, 2678cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualFloatMethodA, 2679cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualDoubleMethod, 2680cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualDoubleMethodV, 2681cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualDoubleMethodA, 2682cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualVoidMethod, 2683cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualVoidMethodV, 2684cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallNonvirtualVoidMethodA, 2685cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetFieldID, 2686cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetObjectField, 2687cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetBooleanField, 2688cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetByteField, 2689cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetCharField, 2690cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetShortField, 2691cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetIntField, 2692cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetLongField, 2693cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetFloatField, 2694cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetDoubleField, 2695cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetObjectField, 2696cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetBooleanField, 2697cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetByteField, 2698cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetCharField, 2699cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetShortField, 2700cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetIntField, 2701cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetLongField, 2702cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetFloatField, 2703cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetDoubleField, 2704cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticMethodID, 2705cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticObjectMethod, 2706cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticObjectMethodV, 2707cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticObjectMethodA, 2708cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticBooleanMethod, 2709cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticBooleanMethodV, 2710cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticBooleanMethodA, 2711cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticByteMethod, 2712cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticByteMethodV, 2713cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticByteMethodA, 2714cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticCharMethod, 2715cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticCharMethodV, 2716cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticCharMethodA, 2717cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticShortMethod, 2718cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticShortMethodV, 2719cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticShortMethodA, 2720cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticIntMethod, 2721cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticIntMethodV, 2722cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticIntMethodA, 2723cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticLongMethod, 2724cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticLongMethodV, 2725cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticLongMethodA, 2726cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticFloatMethod, 2727cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticFloatMethodV, 2728cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticFloatMethodA, 2729cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticDoubleMethod, 2730cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticDoubleMethodV, 2731cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticDoubleMethodA, 2732cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticVoidMethod, 2733cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticVoidMethodV, 2734cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::CallStaticVoidMethodA, 2735cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticFieldID, 2736cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticObjectField, 2737cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticBooleanField, 2738cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticByteField, 2739cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticCharField, 2740cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticShortField, 2741cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticIntField, 2742cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticLongField, 2743cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticFloatField, 2744cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStaticDoubleField, 2745cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticObjectField, 2746cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticBooleanField, 2747cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticByteField, 2748cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticCharField, 2749cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticShortField, 2750cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticIntField, 2751cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticLongField, 2752cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticFloatField, 2753cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetStaticDoubleField, 2754cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewString, 2755cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringLength, 2756cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringChars, 2757cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseStringChars, 2758cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewStringUTF, 2759cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringUTFLength, 2760cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringUTFChars, 2761cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseStringUTFChars, 2762cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetArrayLength, 2763cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewObjectArray, 2764cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetObjectArrayElement, 2765cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetObjectArrayElement, 2766cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewBooleanArray, 2767cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewByteArray, 2768cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewCharArray, 2769cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewShortArray, 2770cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewIntArray, 2771cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewLongArray, 2772cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewFloatArray, 2773cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewDoubleArray, 2774cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetBooleanArrayElements, 2775cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetByteArrayElements, 2776cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetCharArrayElements, 2777cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetShortArrayElements, 2778cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetIntArrayElements, 2779cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetLongArrayElements, 2780cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetFloatArrayElements, 2781cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetDoubleArrayElements, 2782cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseBooleanArrayElements, 2783cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseByteArrayElements, 2784cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseCharArrayElements, 2785cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseShortArrayElements, 2786cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseIntArrayElements, 2787cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseLongArrayElements, 2788cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseFloatArrayElements, 2789cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseDoubleArrayElements, 2790cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetBooleanArrayRegion, 2791cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetByteArrayRegion, 2792cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetCharArrayRegion, 2793cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetShortArrayRegion, 2794cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetIntArrayRegion, 2795cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetLongArrayRegion, 2796cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetFloatArrayRegion, 2797cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetDoubleArrayRegion, 2798cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetBooleanArrayRegion, 2799cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetByteArrayRegion, 2800cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetCharArrayRegion, 2801cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetShortArrayRegion, 2802cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetIntArrayRegion, 2803cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetLongArrayRegion, 2804cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetFloatArrayRegion, 2805cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::SetDoubleArrayRegion, 2806cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::RegisterNatives, 2807cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::UnregisterNatives, 2808cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::MonitorEnter, 2809cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::MonitorExit, 2810cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetJavaVM, 2811cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringRegion, 2812cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringUTFRegion, 2813cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetPrimitiveArrayCritical, 2814cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleasePrimitiveArrayCritical, 2815cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetStringCritical, 2816cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ReleaseStringCritical, 2817cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewWeakGlobalRef, 2818cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::DeleteWeakGlobalRef, 2819cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::ExceptionCheck, 2820cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::NewDirectByteBuffer, 2821cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetDirectBufferAddress, 2822cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetDirectBufferCapacity, 2823cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JNI::GetObjectRefType, 2824ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro}; 2825ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 28267577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesJNIEnvExt::JNIEnvExt(Thread* self, JavaVMExt* vm) 282769f5bc6759f256a146eefd8a7141d39fcc3b0421Elliott Hughes : self(self), 28287577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes vm(vm), 28295a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers local_ref_cookie(IRT_FIRST_SEGMENT), 28305a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers locals(kLocalsInitial, kLocalsMax, kLocal), 28314ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes check_jni(false), 2832bbd76717c14822b68ae6d122d88610b46286272fElliott Hughes critical(false), 28335a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers monitors("monitors", kMonitorsInitial, kMonitorsMax) { 283488c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes functions = unchecked_functions = &gJniNativeInterface; 28354ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes if (vm->check_jni) { 283688c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes SetCheckJniEnabled(true); 2837a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes } 283840ef99eb9dd91c2fa549f40973964529c927bb3cElliott Hughes} 283940ef99eb9dd91c2fa549f40973964529c927bb3cElliott Hughes 2840c1674ed06662420213441ff2b818f2f71f9098dcElliott HughesJNIEnvExt::~JNIEnvExt() { 2841c1674ed06662420213441ff2b818f2f71f9098dcElliott Hughes} 2842c1674ed06662420213441ff2b818f2f71f9098dcElliott Hughes 2843590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierjobject JNIEnvExt::NewLocalRef(mirror::Object* obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 2844590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (obj == nullptr) { 2845590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return nullptr; 2846590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 2847590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return reinterpret_cast<jobject>(locals.Add(local_ref_cookie, obj)); 2848590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier} 2849590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 2850590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartiervoid JNIEnvExt::DeleteLocalRef(jobject obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 2851590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (obj != nullptr) { 2852590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier locals.Remove(local_ref_cookie, reinterpret_cast<IndirectRef>(obj)); 2853590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 2854590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier} 285588c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughesvoid JNIEnvExt::SetCheckJniEnabled(bool enabled) { 285688c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes check_jni = enabled; 285788c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes functions = enabled ? GetCheckJniNativeInterface() : &gJniNativeInterface; 28584ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes} 28594ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes 286073e66f73f5093b64f2b023ebbb85916a13d5c937Elliott Hughesvoid JNIEnvExt::DumpReferenceTables(std::ostream& os) { 286173e66f73f5093b64f2b023ebbb85916a13d5c937Elliott Hughes locals.Dump(os); 286273e66f73f5093b64f2b023ebbb85916a13d5c937Elliott Hughes monitors.Dump(os); 28639d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes} 28649d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 28651bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid JNIEnvExt::PushFrame(int /*capacity*/) { 28661bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes // TODO: take 'capacity' into account. 28672ced6a534157d5d963693346904389c19775d2daElliott Hughes stacked_local_ref_cookies.push_back(local_ref_cookie); 28682ced6a534157d5d963693346904389c19775d2daElliott Hughes local_ref_cookie = locals.GetSegmentState(); 28692ced6a534157d5d963693346904389c19775d2daElliott Hughes} 28702ced6a534157d5d963693346904389c19775d2daElliott Hughes 28712ced6a534157d5d963693346904389c19775d2daElliott Hughesvoid JNIEnvExt::PopFrame() { 28722ced6a534157d5d963693346904389c19775d2daElliott Hughes locals.SetSegmentState(local_ref_cookie); 28732ced6a534157d5d963693346904389c19775d2daElliott Hughes local_ref_cookie = stacked_local_ref_cookies.back(); 28742ced6a534157d5d963693346904389c19775d2daElliott Hughes stacked_local_ref_cookies.pop_back(); 28752ced6a534157d5d963693346904389c19775d2daElliott Hughes} 28762ced6a534157d5d963693346904389c19775d2daElliott Hughes 28772dd0e2cea360bc9206eb88ecc40d259e796c239dIan RogersOffset JNIEnvExt::SegmentStateOffset() { 28782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return Offset(OFFSETOF_MEMBER(JNIEnvExt, locals) + 28792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers IndirectReferenceTable::SegmentStateOffset().Int32Value()); 28802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 28812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2882ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro// JNI Invocation interface. 2883ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2884bddf97641c9371ec74c63bca52fff62fecd73750Brian Carlstromextern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) { 28852ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro const JavaVMInitArgs* args = static_cast<JavaVMInitArgs*>(vm_args); 288683a25328c595975097cf3948451088cbfc64fc09Elliott Hughes if (IsBadJniVersion(args->version)) { 288783a25328c595975097cf3948451088cbfc64fc09Elliott Hughes LOG(ERROR) << "Bad JNI version passed to CreateJavaVM: " << args->version; 28882ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro return JNI_EVERSION; 28892ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 28902ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro Runtime::Options options; 28912ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro for (int i = 0; i < args->nOptions; ++i) { 28922ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro JavaVMOption* option = &args->options[i]; 2893f1a5adc87760f938b01df26d906295063546b259Elliott Hughes options.push_back(std::make_pair(std::string(option->optionString), option->extraInfo)); 28942ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 28952ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro bool ignore_unrecognized = args->ignoreUnrecognized; 289600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (!Runtime::Create(options, ignore_unrecognized)) { 28972ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro return JNI_ERR; 28982ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 289900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers Runtime* runtime = Runtime::Current(); 2900bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom bool started = runtime->Start(); 2901bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom if (!started) { 2902bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom delete Thread::Current()->GetJniEnv(); 2903bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom delete runtime->GetJavaVM(); 2904bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom LOG(WARNING) << "CreateJavaVM failed"; 2905bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom return JNI_ERR; 2906bd86bccf1b47f1151842152ee52cf5d46d6b34abBrian Carlstrom } 290769b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom *p_env = Thread::Current()->GetJniEnv(); 290869b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom *p_vm = runtime->GetJavaVM(); 290969b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom return JNI_OK; 29102ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro} 29112ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 2912f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughesextern "C" jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize, jsize* vm_count) { 29132ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro Runtime* runtime = Runtime::Current(); 2914e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (runtime == nullptr) { 2915f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes *vm_count = 0; 29162ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } else { 2917f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes *vm_count = 1; 291869f5bc6759f256a146eefd8a7141d39fcc3b0421Elliott Hughes vms[0] = runtime->GetJavaVM(); 29192ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 29202ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro return JNI_OK; 29212ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro} 29222ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 29232ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro// Historically unsupported. 29241bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesextern "C" jint JNI_GetDefaultJavaVMInitArgs(void* /*vm_args*/) { 29252ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro return JNI_ERR; 29262ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro} 29272ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 2928cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughesclass JII { 2929cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes public: 2930cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jint DestroyJavaVM(JavaVM* vm) { 2931e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (vm == nullptr) { 2932cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_ERR; 2933cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 29346a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm); 29356a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes delete raw_vm->runtime; 29366a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes return JNI_OK; 29372ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 29382ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 2939cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jint AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, void* thr_args) { 29407577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes return JII_AttachCurrentThread(vm, p_env, thr_args, false); 29412ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 29422ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 2943cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jint AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, void* thr_args) { 29447577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes return JII_AttachCurrentThread(vm, p_env, thr_args, true); 29452ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 29462ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 2947cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jint DetachCurrentThread(JavaVM* vm) { 2948e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (vm == nullptr || Thread::Current() == nullptr) { 2949cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_ERR; 2950cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 29516a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm); 29526a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes Runtime* runtime = raw_vm->runtime; 29536a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes runtime->DetachCurrentThread(); 29546a144338023bdc0ca6954fc71a1f9b4d94088ee4Elliott Hughes return JNI_OK; 29552ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 29562ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 2957cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes static jint GetEnv(JavaVM* vm, void** env, jint version) { 29583b7ffa1f4c466f4bf8032c328a47aea83a23868cElliott Hughes // GetEnv always returns a JNIEnv* for the most current supported JNI version, 29593b7ffa1f4c466f4bf8032c328a47aea83a23868cElliott Hughes // and unlike other calls that take a JNI version doesn't care if you supply 29603b7ffa1f4c466f4bf8032c328a47aea83a23868cElliott Hughes // JNI_VERSION_1_1, which we don't otherwise support. 29613b7ffa1f4c466f4bf8032c328a47aea83a23868cElliott Hughes if (IsBadJniVersion(version) && version != JNI_VERSION_1_1) { 296283a25328c595975097cf3948451088cbfc64fc09Elliott Hughes LOG(ERROR) << "Bad JNI version passed to GetEnv: " << version; 2963cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_EVERSION; 2964cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2965e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (vm == nullptr || env == nullptr) { 2966cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_ERR; 2967cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2968cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes Thread* thread = Thread::Current(); 2969e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (thread == nullptr) { 2970e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier *env = nullptr; 2971cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return JNI_EDETACHED; 2972cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 2973cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes *env = thread->GetJniEnv(); 29742ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro return JNI_OK; 29752ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 2976cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes}; 29772ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 297888c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughesconst JNIInvokeInterface gJniInvokeInterface = { 2979e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved0 2980e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved1 2981e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier nullptr, // reserved2 2982cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JII::DestroyJavaVM, 2983cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JII::AttachCurrentThread, 2984cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JII::DetachCurrentThread, 2985cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JII::GetEnv, 2986cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes JII::AttachCurrentThreadAsDaemon 2987ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro}; 2988ea4dca856f8c19299a1858d2cc1f35b03ca0f694Carl Shapiro 2989491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian CarlstromJavaVMExt::JavaVMExt(Runtime* runtime, ParsedOptions* options) 299069f5bc6759f256a146eefd8a7141d39fcc3b0421Elliott Hughes : runtime(runtime), 2991e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier check_jni_abort_hook(nullptr), 2992e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier check_jni_abort_hook_data(nullptr), 29934ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes check_jni(false), 29947934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom force_copy(false), // TODO: add a way to enable this 2995a09576416788b916095739e43a16917e7948f3a4Elliott Hughes trace(options->jni_trace_), 2996c2dc62d1c9241dfe880a81698713c314b13aa63fElliott Hughes work_around_app_jni_bugs(false), 299762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers pins_lock("JNI pin table lock", kPinTableLock), 29982ced6a534157d5d963693346904389c19775d2daElliott Hughes pin_table("pin table", kPinTableInitial, kPinTableMax), 29998daa0929f08a3080ea64dbd4e997e72f411e6fc9Elliott Hughes globals_lock("JNI global reference table lock"), 3000bb1e8f0a07c12a8b0a2dd3cab6a1a7e825a54c6fElliott Hughes globals(gGlobalsInitial, gGlobalsMax, kGlobal), 300100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers libraries_lock("JNI shared libraries map lock", kLoadLibraryLock), 3002c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier libraries(new Libraries), 3003c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_lock_("JNI weak global reference table lock"), 3004c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_(kWeakGlobalsInitial, kWeakGlobalsMax, kWeakGlobal), 3005c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier allow_new_weak_globals_(true), 3006c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_add_condition_("weak globals add condition", weak_globals_lock_) { 300788c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes functions = unchecked_functions = &gJniInvokeInterface; 30084ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes if (options->check_jni_) { 300988c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes SetCheckJniEnabled(true); 3010a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes } 3011f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes} 3012f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 3013de69d7f8c32be83c405bf5a9c5f15fc655f578faElliott HughesJavaVMExt::~JavaVMExt() { 301479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes delete libraries; 3015de69d7f8c32be83c405bf5a9c5f15fc655f578faElliott Hughes} 3016de69d7f8c32be83c405bf5a9c5f15fc655f578faElliott Hughes 3017c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartierjweak JavaVMExt::AddWeakGlobalReference(Thread* self, mirror::Object* obj) { 3018c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier if (obj == nullptr) { 3019c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier return nullptr; 3020c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier } 3021c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(self, weak_globals_lock_); 3022c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier while (UNLIKELY(!allow_new_weak_globals_)) { 3023c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_add_condition_.WaitHoldingLocks(self); 3024c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier } 3025c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier IndirectRef ref = weak_globals_.Add(IRT_FIRST_SEGMENT, obj); 3026c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier return reinterpret_cast<jweak>(ref); 3027c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier} 3028c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier 3029c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartiervoid JavaVMExt::DeleteWeakGlobalRef(Thread* self, jweak obj) { 3030c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(self, weak_globals_lock_); 3031c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier if (!weak_globals_.Remove(IRT_FIRST_SEGMENT, obj)) { 3032c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier LOG(WARNING) << "JNI WARNING: DeleteWeakGlobalRef(" << obj << ") " 3033c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier << "failed to find entry"; 3034c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier } 3035c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier} 3036c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier 303788c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughesvoid JavaVMExt::SetCheckJniEnabled(bool enabled) { 303888c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes check_jni = enabled; 303988c5c355fc3d881f905564911d746b2313d5fc89Elliott Hughes functions = enabled ? GetCheckJniInvokeInterface() : &gJniInvokeInterface; 30404ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes} 30414ffd31315bc0d00ec278e85feed15985de5ac3dcElliott Hughes 3042ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughesvoid JavaVMExt::DumpForSigQuit(std::ostream& os) { 3043ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << "JNI: CheckJNI is " << (check_jni ? "on" : "off"); 3044ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes if (force_copy) { 3045ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << " (with forcecopy)"; 3046ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 3047ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << "; workarounds are " << (work_around_app_jni_bugs ? "on" : "off"); 304850b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers Thread* self = Thread::Current(); 3049ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes { 305050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, pins_lock); 3051ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << "; pins=" << pin_table.Size(); 3052ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 3053ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes { 3054b8a0b94735f188bc739e4c55479c37699006b881Ian Rogers ReaderMutexLock mu(self, globals_lock); 3055ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << "; globals=" << globals.Capacity(); 3056ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 3057ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes { 3058c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(self, weak_globals_lock_); 3059c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier if (weak_globals_.Capacity() > 0) { 3060c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier os << " (plus " << weak_globals_.Capacity() << " weak)"; 3061ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 3062ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 3063ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << '\n'; 3064ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes 3065ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes { 306650b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, libraries_lock); 3067ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes os << "Libraries: " << Dumpable<Libraries>(*libraries) << " (" << libraries->size() << ")\n"; 3068ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes } 3069ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes} 3070ae80b493748c5b6ffe310a91c651e7043f4b2daeElliott Hughes 3071c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartiervoid JavaVMExt::DisallowNewWeakGlobals() { 3072c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(Thread::Current(), weak_globals_lock_); 3073c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier allow_new_weak_globals_ = false; 3074c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier} 3075c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier 3076c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartiervoid JavaVMExt::AllowNewWeakGlobals() { 3077c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier Thread* self = Thread::Current(); 3078c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(self, weak_globals_lock_); 3079c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier allow_new_weak_globals_ = true; 3080c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_add_condition_.Broadcast(self); 3081c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier} 3082c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier 3083c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartiermirror::Object* JavaVMExt::DecodeWeakGlobal(Thread* self, IndirectRef ref) { 3084c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(self, weak_globals_lock_); 3085c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier while (UNLIKELY(!allow_new_weak_globals_)) { 3086c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_add_condition_.WaitHoldingLocks(self); 3087c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier } 30885647d189c3ea5324e569d96cef67c87879d6cd05Mathieu Chartier return weak_globals_.Get(ref); 3089c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier} 3090c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier 309173e66f73f5093b64f2b023ebbb85916a13d5c937Elliott Hughesvoid JavaVMExt::DumpReferenceTables(std::ostream& os) { 309250b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers Thread* self = Thread::Current(); 30939d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes { 3094b8a0b94735f188bc739e4c55479c37699006b881Ian Rogers ReaderMutexLock mu(self, globals_lock); 309573e66f73f5093b64f2b023ebbb85916a13d5c937Elliott Hughes globals.Dump(os); 30969d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 30979d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes { 3098c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier MutexLock mu(self, weak_globals_lock_); 3099c11d9b8870de5f860b13c84003ade7b3f3125a52Mathieu Chartier weak_globals_.Dump(os); 31009d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 31019d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes { 310250b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, pins_lock); 310373e66f73f5093b64f2b023ebbb85916a13d5c937Elliott Hughes pin_table.Dump(os); 31049d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 31059d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes} 31069d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 3107055d46c479369ea825712834353660b45215c195Mathieu Chartierbool JavaVMExt::LoadNativeLibrary(const std::string& path, 3108e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier const SirtRef<mirror::ClassLoader>& class_loader, 31091eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers std::string* detail) { 31101eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers detail->clear(); 3111cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 3112cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // See if we've already loaded this library. If we have, and the class loader 3113cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // matches, return successfully without doing anything. 31147577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes // TODO: for better results we should canonicalize the pathname (or even compare 31157577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes // inodes). This implementation is fine if everybody is using System.loadLibrary. 311679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes SharedLibrary* library; 311750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers Thread* self = Thread::Current(); 311879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes { 311979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // TODO: move the locking (and more of this logic) into Libraries. 312050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, libraries_lock); 312179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes library = libraries->Get(path); 312279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 3123e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (library != nullptr) { 3124055d46c479369ea825712834353660b45215c195Mathieu Chartier if (library->GetClassLoader() != class_loader.get()) { 31257577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes // The library will be associated with class_loader. The JNI 31267577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes // spec says we can't load the same library into more than one 31277577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes // class loader. 31281eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers StringAppendF(detail, "Shared library \"%s\" already opened by " 31297577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes "ClassLoader %p; can't open in ClassLoader %p", 3130055d46c479369ea825712834353660b45215c195Mathieu Chartier path.c_str(), library->GetClassLoader(), class_loader.get()); 31317577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes LOG(WARNING) << detail; 3132cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return false; 3133cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 31344dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes VLOG(jni) << "[Shared library \"" << path << "\" already loaded in " 3135055d46c479369ea825712834353660b45215c195Mathieu Chartier << "ClassLoader " << class_loader.get() << "]"; 31361bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes if (!library->CheckOnLoadResult()) { 31371eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers StringAppendF(detail, "JNI_OnLoad failed on a previous attempt " 31387577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes "to load \"%s\"", path.c_str()); 3139cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return false; 3140cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 3141cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return true; 3142cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 3143cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 3144cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Open the shared library. Because we're using a full path, the system 3145cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // doesn't have to search through LD_LIBRARY_PATH. (It may do so to 3146cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // resolve this library's dependencies though.) 3147cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 3148cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Failures here are expected when java.library.path has several entries 3149cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // and we have to hunt for the lib. 3150cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 315100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Below we dlopen but there is no paired dlclose, this would be necessary if we supported 315200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // class unloading. Libraries will only be unloaded when the reference count (incremented by 315300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // dlopen) becomes zero from dlclose. 315400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 3155cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // This can execute slowly for a large library on a busy system, so we 315600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // want to switch from kRunnable while it executes. This allows the GC to ignore us. 315700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers self->TransitionFromRunnableToSuspended(kWaitingForJniOnLoad); 3158e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier void* handle = dlopen(path.empty() ? nullptr : path.c_str(), RTLD_LAZY); 315900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers self->TransitionFromSuspendedToRunnable(); 3160cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 316184b2f14d57eaf55988c0e0ff80551fde27daffc1Elliott Hughes VLOG(jni) << "[Call to dlopen(\"" << path << "\", RTLD_LAZY) returned " << handle << "]"; 3162cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 3163e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (handle == nullptr) { 31641eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers *detail = dlerror(); 316584b2f14d57eaf55988c0e0ff80551fde27daffc1Elliott Hughes LOG(ERROR) << "dlopen(\"" << path << "\", RTLD_LAZY) failed: " << detail; 3166cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes return false; 3167cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 3168cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 3169cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes // Create a new entry. 317000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // TODO: move the locking (and more of this logic) into Libraries. 317100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers bool created_library = false; 317279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes { 317350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, libraries_lock); 317479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes library = libraries->Get(path); 3175e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (library == nullptr) { // We won race to get libraries_lock 3176055d46c479369ea825712834353660b45215c195Mathieu Chartier library = new SharedLibrary(path, handle, class_loader.get()); 317700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers libraries->Put(path, library); 317800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers created_library = true; 317979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 318000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 318100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (!created_library) { 318200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOG(INFO) << "WOW: we lost a race to add shared library: " 3183055d46c479369ea825712834353660b45215c195Mathieu Chartier << "\"" << path << "\" ClassLoader=" << class_loader.get(); 318400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return library->CheckOnLoadResult(); 318579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 3186cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 3187055d46c479369ea825712834353660b45215c195Mathieu Chartier VLOG(jni) << "[Added shared library \"" << path << "\" for ClassLoader " << class_loader.get() 3188055d46c479369ea825712834353660b45215c195Mathieu Chartier << "]"; 3189cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 31907935372ab784477db452d11112cd60d26be87093Elliott Hughes bool was_successful = false; 319179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes void* sym = dlsym(handle, "JNI_OnLoad"); 3192e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (sym == nullptr) { 31934dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes VLOG(jni) << "[No JNI_OnLoad found in \"" << path << "\"]"; 319485affca81271f573c75c32316aa6faa8e52448b1Elliott Hughes was_successful = true; 319579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } else { 319679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // Call JNI_OnLoad. We have to override the current class 319779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // loader, which will always be "null" since the stuff at the 319879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // top of the stack is around Runtime.loadLibrary(). (See 319979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // the comments in the JNI FindClass function.) 320079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes typedef int (*JNI_OnLoadFn)(JavaVM*, void*); 320179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes JNI_OnLoadFn jni_on_load = reinterpret_cast<JNI_OnLoadFn>(sym); 3202e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier SirtRef<mirror::ClassLoader> old_class_loader(self, self->GetClassLoaderOverride()); 3203055d46c479369ea825712834353660b45215c195Mathieu Chartier self->SetClassLoaderOverride(class_loader.get()); 320479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 3205ad7c2a3b4daa2abd707375444f4b0db7d69a3838Elliott Hughes int version = 0; 3206ad7c2a3b4daa2abd707375444f4b0db7d69a3838Elliott Hughes { 320734e069606d6f1698cd3c33b39e72b79ae27e1c7bElliott Hughes ScopedThreadStateChange tsc(self, kNative); 32084dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes VLOG(jni) << "[Calling JNI_OnLoad in \"" << path << "\"]"; 3209e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier version = (*jni_on_load)(this, nullptr); 321079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 321179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 3212590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier self->SetClassLoaderOverride(old_class_loader.get()); 321379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 32147935372ab784477db452d11112cd60d26be87093Elliott Hughes if (version == JNI_ERR) { 32151eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers StringAppendF(detail, "JNI_ERR returned from JNI_OnLoad in \"%s\"", path.c_str()); 32167935372ab784477db452d11112cd60d26be87093Elliott Hughes } else if (IsBadJniVersion(version)) { 32171eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers StringAppendF(detail, "Bad JNI version returned from JNI_OnLoad in \"%s\": %d", 321875fe90cdb6e358a09047468b750648c8a3bfac9fBrian Carlstrom path.c_str(), version); 321979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // It's unwise to call dlclose() here, but we can mark it 322079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // as bad and ensure that future load attempts will fail. 322179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // We don't know how far JNI_OnLoad got, so there could 322279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // be some partially-initialized stuff accessible through 322379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // newly-registered native method calls. We could try to 322479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // unregister them, but that doesn't seem worthwhile. 32257935372ab784477db452d11112cd60d26be87093Elliott Hughes } else { 32267935372ab784477db452d11112cd60d26be87093Elliott Hughes was_successful = true; 3227cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 32287935372ab784477db452d11112cd60d26be87093Elliott Hughes VLOG(jni) << "[Returned " << (was_successful ? "successfully" : "failure") 322975fe90cdb6e358a09047468b750648c8a3bfac9fBrian Carlstrom << " from JNI_OnLoad in \"" << path << "\"]"; 323079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 3231cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 32327935372ab784477db452d11112cd60d26be87093Elliott Hughes library->SetResult(was_successful); 32337935372ab784477db452d11112cd60d26be87093Elliott Hughes return was_successful; 323479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes} 323579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 3236e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartiervoid* JavaVMExt::FindCodeForNativeMethod(mirror::ArtMethod* m) { 323779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes CHECK(m->IsNative()); 3238e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier mirror::Class* c = m->GetDeclaringClass(); 323979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // If this is a static method, it could be called before the class 324079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes // has been initialized. 324179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes if (m->IsStatic()) { 3242c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier c = EnsureInitialized(Thread::Current(), c); 3243c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (c == nullptr) { 3244c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier return nullptr; 324579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } 324679082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes } else { 3247b8a0b94735f188bc739e4c55479c37699006b881Ian Rogers CHECK(c->IsInitializing()) << c->GetStatus() << " " << PrettyMethod(m); 3248cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes } 3249161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom std::string detail; 3250161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom void* native_method; 325150b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers Thread* self = Thread::Current(); 3252161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom { 325350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, libraries_lock); 3254161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom native_method = libraries->FindNativeMethod(m, detail); 3255161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom } 325662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers // Throwing can cause libraries_lock to be reacquired. 3257e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (native_method == nullptr) { 325862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 325962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->ThrowNewException(throw_location, "Ljava/lang/UnsatisfiedLinkError;", detail.c_str()); 3260161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom } 3261161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom return native_method; 3262cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes} 3263cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes 326483c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartiervoid JavaVMExt::SweepJniWeakGlobals(IsMarkedCallback* callback, void* arg) { 3265810b1d704f2db0d935bf5dddae3545f79cabd435Mathieu Chartier MutexLock mu(Thread::Current(), weak_globals_lock_); 3266810b1d704f2db0d935bf5dddae3545f79cabd435Mathieu Chartier for (mirror::Object** entry : weak_globals_) { 32676aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier mirror::Object* obj = *entry; 326883c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier mirror::Object* new_obj = callback(obj, arg); 32696aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier if (new_obj == nullptr) { 32706aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier new_obj = kClearedJniWeakGlobal; 32716aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier } 32726aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier *entry = new_obj; 32736aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier } 32746aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier} 32756aa3df965395566ed6a4fec4af37c2b7577992e9Mathieu Chartier 327683c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartiervoid JavaVMExt::VisitRoots(RootCallback* callback, void* arg) { 327750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers Thread* self = Thread::Current(); 3278410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes { 3279b8a0b94735f188bc739e4c55479c37699006b881Ian Rogers ReaderMutexLock mu(self, globals_lock); 328083c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier globals.VisitRoots(callback, arg, 0, kRootJNIGlobal); 3281410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes } 3282410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes { 328350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers MutexLock mu(self, pins_lock); 328483c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier pin_table.VisitRoots(callback, arg, 0, kRootVMInternal); 3285410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes } 32868f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier { 32878f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier MutexLock mu(self, libraries_lock); 32888f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier // Libraries contains shared libraries which hold a pointer to a class loader. 328983c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier libraries->VisitRoots(callback, arg); 32908f4be93c8260b84d706d91586aff572791edd9feMathieu Chartier } 3291410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes // The weak_globals table is visited by the GC itself (because it mutates the table). 3292410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes} 3293410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes 3294c8fece309fa1d3514071fadaca34530648462b50Elliott Hughesvoid RegisterNativeMethods(JNIEnv* env, const char* jni_class_name, const JNINativeMethod* methods, 3295bc939663ccfbe0c648dd6a3670041510aca82420Ian Rogers jint method_count) { 3296c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes ScopedLocalRef<jclass> c(env, env->FindClass(jni_class_name)); 3297e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier if (c.get() == nullptr) { 3298c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes LOG(FATAL) << "Couldn't find class: " << jni_class_name; 3299c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes } 3300c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes JNI::RegisterNativeMethods(env, c.get(), methods, method_count, false); 3301c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes} 3302c8fece309fa1d3514071fadaca34530648462b50Elliott Hughes 3303df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} // namespace art 3304b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes 3305b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughesstd::ostream& operator<<(std::ostream& os, const jobjectRefType& rhs) { 3306b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes switch (rhs) { 3307b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case JNIInvalidRefType: 3308b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes os << "JNIInvalidRefType"; 3309b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return os; 3310b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case JNILocalRefType: 3311b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes os << "JNILocalRefType"; 3312b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return os; 3313b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case JNIGlobalRefType: 3314b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes os << "JNIGlobalRefType"; 3315b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return os; 3316b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes case JNIWeakGlobalRefType: 3317b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes os << "JNIWeakGlobalRefType"; 3318b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes return os; 33192e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom default: 332024782c6aa7abf396de057d7eb15035b4c594a3b4Shih-wei Liao LOG(FATAL) << "jobjectRefType[" << static_cast<int>(rhs) << "]"; 33212e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom return os; 3322b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes } 3323b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes} 3324