blob: 453c92f495b8cd4a393d7beeab212f1f146642b6 [file] [log] [blame]
Calin Juravlec8423522014-08-12 20:55:20 +01001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "native_bridge_art_interface.h"
18
19#include "mirror/art_method-inl.h"
20#include "mirror/class-inl.h"
21#include "scoped_thread_state_change.h"
22
23namespace art {
24
25const char* GetMethodShorty(JNIEnv* env, jmethodID mid) {
26 ScopedObjectAccess soa(env);
27 StackHandleScope<1> scope(soa.Self());
28 mirror::ArtMethod* m = soa.DecodeMethod(mid);
29 MethodHelper mh(scope.NewHandle(m));
30 return mh.GetShorty();
31}
32
33uint32_t GetNativeMethodCount(JNIEnv* env, jclass clazz) {
34 if (clazz == nullptr)
35 return 0;
36
37 ScopedObjectAccess soa(env);
38 mirror::Class* c = soa.Decode<mirror::Class*>(clazz);
39
40 uint32_t native_method_count = 0;
41 for (uint32_t i = 0; i < c->NumDirectMethods(); ++i) {
42 mirror::ArtMethod* m = c->GetDirectMethod(i);
43 if (m->IsNative()) {
44 native_method_count++;
45 }
46 }
47 for (uint32_t i = 0; i < c->NumVirtualMethods(); ++i) {
48 mirror::ArtMethod* m = c->GetVirtualMethod(i);
49 if (m->IsNative()) {
50 native_method_count++;
51 }
52 }
53 return native_method_count;
54}
55
56uint32_t GetNativeMethods(JNIEnv* env, jclass clazz, JNINativeMethod* methods,
57 uint32_t method_count) {
58 if ((clazz == nullptr) || (methods == nullptr)) {
59 return 0;
60 }
61 ScopedObjectAccess soa(env);
62 mirror::Class* c = soa.Decode<mirror::Class*>(clazz);
63
64 uint32_t count = 0;
65 for (uint32_t i = 0; i < c->NumDirectMethods(); ++i) {
66 mirror::ArtMethod* m = c->GetDirectMethod(i);
67 if (m->IsNative()) {
68 if (count < method_count) {
69 methods[count].name = m->GetName();
70 methods[count].signature = m->GetShorty();
71 methods[count].fnPtr = const_cast<void*>(m->GetNativeMethod());
72 count++;
73 } else {
74 LOG(WARNING) << "Output native method array too small. Skipping " << PrettyMethod(m);
75 }
76 }
77 }
78 for (uint32_t i = 0; i < c->NumVirtualMethods(); ++i) {
79 mirror::ArtMethod* m = c->GetVirtualMethod(i);
80 if (m->IsNative()) {
81 if (count < method_count) {
82 methods[count].name = m->GetName();
83 methods[count].signature = m->GetShorty();
84 methods[count].fnPtr = const_cast<void*>(m->GetNativeMethod());
85 count++;
86 } else {
87 LOG(WARNING) << "Output native method array too small. Skipping " << PrettyMethod(m);
88 }
89 }
90 }
91 return count;
92}
93
94}; // namespace art