xref: /aosp_15_r20/art/libartpalette/apex/palette.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "palette/palette.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <dlfcn.h>
20*795d594fSAndroid Build Coastguard Worker #include <stdlib.h>
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include <android/log.h>
23*795d594fSAndroid Build Coastguard Worker #include <android-base/macros.h>
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker namespace {
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker // Logging tag.
28*795d594fSAndroid Build Coastguard Worker static constexpr const char* kLogTag = "libartpalette";
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker // Name of the palette library present in the /system partition.
31*795d594fSAndroid Build Coastguard Worker static constexpr const char* kPaletteSystemLibrary = "libartpalette-system.so";
32*795d594fSAndroid Build Coastguard Worker 
33*795d594fSAndroid Build Coastguard Worker // Generic method used when a dynamically loaded palette instance does not
34*795d594fSAndroid Build Coastguard Worker // support a method.
PaletteMethodNotSupported()35*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteMethodNotSupported() {
36*795d594fSAndroid Build Coastguard Worker   return PALETTE_STATUS_NOT_SUPPORTED;
37*795d594fSAndroid Build Coastguard Worker }
38*795d594fSAndroid Build Coastguard Worker 
39*795d594fSAndroid Build Coastguard Worker // Declare type aliases for pointers to each function in the interface.
40*795d594fSAndroid Build Coastguard Worker #define PALETTE_METHOD_TYPE_ALIAS(Name, ...) \
41*795d594fSAndroid Build Coastguard Worker   using Name ## Method = palette_status_t(*)(__VA_ARGS__);
42*795d594fSAndroid Build Coastguard Worker PALETTE_METHOD_LIST(PALETTE_METHOD_TYPE_ALIAS)
43*795d594fSAndroid Build Coastguard Worker #undef PALETTE_METHOD_TYPE_ALIAS
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker // Singleton class responsible for dynamically loading the palette library and
46*795d594fSAndroid Build Coastguard Worker // binding functions there to method pointers.
47*795d594fSAndroid Build Coastguard Worker class PaletteLoader {
48*795d594fSAndroid Build Coastguard Worker  public:
Instance()49*795d594fSAndroid Build Coastguard Worker   static PaletteLoader& Instance() {
50*795d594fSAndroid Build Coastguard Worker     static PaletteLoader instance;
51*795d594fSAndroid Build Coastguard Worker     return instance;
52*795d594fSAndroid Build Coastguard Worker   }
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker   // Accessor methods to get instances of palette methods.
55*795d594fSAndroid Build Coastguard Worker #define PALETTE_LOADER_METHOD_ACCESSOR(Name, ...)                       \
56*795d594fSAndroid Build Coastguard Worker   Name ## Method Get ## Name ## Method() const { return Name ## Method ## _; }
57*795d594fSAndroid Build Coastguard Worker PALETTE_METHOD_LIST(PALETTE_LOADER_METHOD_ACCESSOR)
58*795d594fSAndroid Build Coastguard Worker #undef PALETTE_LOADER_METHOD_ACCESSOR
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker  private:
61*795d594fSAndroid Build Coastguard Worker   PaletteLoader();
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker   static void* OpenLibrary();
64*795d594fSAndroid Build Coastguard Worker   static void* GetMethod(void* palette_lib, const char* name);
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker   // Handle to the palette library from dlopen().
67*795d594fSAndroid Build Coastguard Worker   void* palette_lib_;
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker   // Fields to store pointers to palette methods.
70*795d594fSAndroid Build Coastguard Worker #define PALETTE_LOADER_METHOD_FIELD(Name, ...) \
71*795d594fSAndroid Build Coastguard Worker   const Name ## Method Name ## Method ## _;
72*795d594fSAndroid Build Coastguard Worker   PALETTE_METHOD_LIST(PALETTE_LOADER_METHOD_FIELD)
73*795d594fSAndroid Build Coastguard Worker #undef PALETTE_LOADER_METHOD_FIELD
74*795d594fSAndroid Build Coastguard Worker 
75*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(PaletteLoader);
76*795d594fSAndroid Build Coastguard Worker };
77*795d594fSAndroid Build Coastguard Worker 
OpenLibrary()78*795d594fSAndroid Build Coastguard Worker void* PaletteLoader::OpenLibrary() {
79*795d594fSAndroid Build Coastguard Worker   void* handle = dlopen(kPaletteSystemLibrary, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
80*795d594fSAndroid Build Coastguard Worker   if (handle == nullptr) {
81*795d594fSAndroid Build Coastguard Worker     // dlerror message includes details of error and file being opened.
82*795d594fSAndroid Build Coastguard Worker     __android_log_assert(nullptr, kLogTag, "%s", dlerror());
83*795d594fSAndroid Build Coastguard Worker   }
84*795d594fSAndroid Build Coastguard Worker   return handle;
85*795d594fSAndroid Build Coastguard Worker }
86*795d594fSAndroid Build Coastguard Worker 
GetMethod(void * palette_lib,const char * name)87*795d594fSAndroid Build Coastguard Worker void* PaletteLoader::GetMethod(void* palette_lib, const char* name) {
88*795d594fSAndroid Build Coastguard Worker   void* method = nullptr;
89*795d594fSAndroid Build Coastguard Worker   if (palette_lib != nullptr) {
90*795d594fSAndroid Build Coastguard Worker     method = dlsym(palette_lib, name);
91*795d594fSAndroid Build Coastguard Worker   }
92*795d594fSAndroid Build Coastguard Worker   if (method == nullptr) {
93*795d594fSAndroid Build Coastguard Worker     return reinterpret_cast<void*>(PaletteMethodNotSupported);
94*795d594fSAndroid Build Coastguard Worker   }
95*795d594fSAndroid Build Coastguard Worker   // TODO(oth): consider new GetMethodSignature() in the Palette API which
96*795d594fSAndroid Build Coastguard Worker   // would allow checking the validity of the type signatures.
97*795d594fSAndroid Build Coastguard Worker   return method;
98*795d594fSAndroid Build Coastguard Worker }
99*795d594fSAndroid Build Coastguard Worker 
PaletteLoader()100*795d594fSAndroid Build Coastguard Worker PaletteLoader::PaletteLoader() :
101*795d594fSAndroid Build Coastguard Worker     palette_lib_(OpenLibrary())
102*795d594fSAndroid Build Coastguard Worker #define PALETTE_LOADER_BIND_METHOD(Name, ...)                           \
103*795d594fSAndroid Build Coastguard Worker     , Name ## Method ## _(reinterpret_cast<Name ## Method>(GetMethod(palette_lib_, #Name)))
104*795d594fSAndroid Build Coastguard Worker     PALETTE_METHOD_LIST(PALETTE_LOADER_BIND_METHOD)
105*795d594fSAndroid Build Coastguard Worker #undef PALETTE_LOADER_BIND_METHOD
106*795d594fSAndroid Build Coastguard Worker {
107*795d594fSAndroid Build Coastguard Worker }
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker }  // namespace
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker extern "C" {
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker // Unless explicitly mentioned otherwise, the following methods have been
114*795d594fSAndroid Build Coastguard Worker // introduced in version 1 API, corresponding to SDK level 31.
115*795d594fSAndroid Build Coastguard Worker 
PaletteSchedSetPriority(int32_t tid,int32_t java_priority)116*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteSchedSetPriority(int32_t tid, int32_t java_priority) {
117*795d594fSAndroid Build Coastguard Worker   PaletteSchedSetPriorityMethod m = PaletteLoader::Instance().GetPaletteSchedSetPriorityMethod();
118*795d594fSAndroid Build Coastguard Worker   return m(tid, java_priority);
119*795d594fSAndroid Build Coastguard Worker }
120*795d594fSAndroid Build Coastguard Worker 
PaletteSchedGetPriority(int32_t tid,int32_t * java_priority)121*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteSchedGetPriority(int32_t tid, /*out*/int32_t* java_priority) {
122*795d594fSAndroid Build Coastguard Worker   PaletteSchedGetPriorityMethod m = PaletteLoader::Instance().GetPaletteSchedGetPriorityMethod();
123*795d594fSAndroid Build Coastguard Worker   return m(tid, java_priority);
124*795d594fSAndroid Build Coastguard Worker }
125*795d594fSAndroid Build Coastguard Worker 
PaletteWriteCrashThreadStacks(const char * stack,size_t stack_len)126*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteWriteCrashThreadStacks(/*in*/const char* stack, size_t stack_len) {
127*795d594fSAndroid Build Coastguard Worker   PaletteWriteCrashThreadStacksMethod m =
128*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteWriteCrashThreadStacksMethod();
129*795d594fSAndroid Build Coastguard Worker   return m(stack, stack_len);
130*795d594fSAndroid Build Coastguard Worker }
131*795d594fSAndroid Build Coastguard Worker 
PaletteTraceEnabled(bool * enabled)132*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteTraceEnabled(/*out*/bool* enabled) {
133*795d594fSAndroid Build Coastguard Worker   PaletteTraceEnabledMethod m = PaletteLoader::Instance().GetPaletteTraceEnabledMethod();
134*795d594fSAndroid Build Coastguard Worker   return m(enabled);
135*795d594fSAndroid Build Coastguard Worker }
136*795d594fSAndroid Build Coastguard Worker 
PaletteTraceBegin(const char * name)137*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteTraceBegin(/*in*/const char* name) {
138*795d594fSAndroid Build Coastguard Worker   PaletteTraceBeginMethod m = PaletteLoader::Instance().GetPaletteTraceBeginMethod();
139*795d594fSAndroid Build Coastguard Worker   return m(name);
140*795d594fSAndroid Build Coastguard Worker }
141*795d594fSAndroid Build Coastguard Worker 
PaletteTraceEnd()142*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteTraceEnd() {
143*795d594fSAndroid Build Coastguard Worker   PaletteTraceEndMethod m = PaletteLoader::Instance().GetPaletteTraceEndMethod();
144*795d594fSAndroid Build Coastguard Worker   return m();
145*795d594fSAndroid Build Coastguard Worker }
146*795d594fSAndroid Build Coastguard Worker 
PaletteTraceIntegerValue(const char * name,int32_t value)147*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteTraceIntegerValue(/*in*/const char* name, int32_t value) {
148*795d594fSAndroid Build Coastguard Worker   PaletteTraceIntegerValueMethod m = PaletteLoader::Instance().GetPaletteTraceIntegerValueMethod();
149*795d594fSAndroid Build Coastguard Worker   return m(name, value);
150*795d594fSAndroid Build Coastguard Worker }
151*795d594fSAndroid Build Coastguard Worker 
PaletteAshmemCreateRegion(const char * name,size_t size,int * fd)152*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteAshmemCreateRegion(const char* name, size_t size, int* fd) {
153*795d594fSAndroid Build Coastguard Worker   PaletteAshmemCreateRegionMethod m =
154*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteAshmemCreateRegionMethod();
155*795d594fSAndroid Build Coastguard Worker   return m(name, size, fd);
156*795d594fSAndroid Build Coastguard Worker }
157*795d594fSAndroid Build Coastguard Worker 
PaletteAshmemSetProtRegion(int fd,int prot)158*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteAshmemSetProtRegion(int fd, int prot) {
159*795d594fSAndroid Build Coastguard Worker   PaletteAshmemSetProtRegionMethod m =
160*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteAshmemSetProtRegionMethod();
161*795d594fSAndroid Build Coastguard Worker   return m(fd, prot);
162*795d594fSAndroid Build Coastguard Worker }
163*795d594fSAndroid Build Coastguard Worker 
PaletteCreateOdrefreshStagingDirectory(const char ** staging_dir)164*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteCreateOdrefreshStagingDirectory(const char** staging_dir) {
165*795d594fSAndroid Build Coastguard Worker   PaletteCreateOdrefreshStagingDirectoryMethod m =
166*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteCreateOdrefreshStagingDirectoryMethod();
167*795d594fSAndroid Build Coastguard Worker   return m(staging_dir);
168*795d594fSAndroid Build Coastguard Worker }
169*795d594fSAndroid Build Coastguard Worker 
PaletteShouldReportDex2oatCompilation(bool * value)170*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteShouldReportDex2oatCompilation(bool* value) {
171*795d594fSAndroid Build Coastguard Worker   PaletteShouldReportDex2oatCompilationMethod m =
172*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteShouldReportDex2oatCompilationMethod();
173*795d594fSAndroid Build Coastguard Worker   return m(value);
174*795d594fSAndroid Build Coastguard Worker }
175*795d594fSAndroid Build Coastguard Worker 
PaletteNotifyStartDex2oatCompilation(int source_fd,int art_fd,int oat_fd,int vdex_fd)176*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteNotifyStartDex2oatCompilation(int source_fd,
177*795d594fSAndroid Build Coastguard Worker                                                       int art_fd,
178*795d594fSAndroid Build Coastguard Worker                                                       int oat_fd,
179*795d594fSAndroid Build Coastguard Worker                                                       int vdex_fd) {
180*795d594fSAndroid Build Coastguard Worker   PaletteNotifyStartDex2oatCompilationMethod m =
181*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteNotifyStartDex2oatCompilationMethod();
182*795d594fSAndroid Build Coastguard Worker   return m(source_fd, art_fd, oat_fd, vdex_fd);
183*795d594fSAndroid Build Coastguard Worker }
184*795d594fSAndroid Build Coastguard Worker 
PaletteNotifyEndDex2oatCompilation(int source_fd,int art_fd,int oat_fd,int vdex_fd)185*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteNotifyEndDex2oatCompilation(int source_fd,
186*795d594fSAndroid Build Coastguard Worker                                                     int art_fd,
187*795d594fSAndroid Build Coastguard Worker                                                     int oat_fd,
188*795d594fSAndroid Build Coastguard Worker                                                     int vdex_fd) {
189*795d594fSAndroid Build Coastguard Worker   PaletteNotifyEndDex2oatCompilationMethod m =
190*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteNotifyEndDex2oatCompilationMethod();
191*795d594fSAndroid Build Coastguard Worker   return m(source_fd, art_fd, oat_fd, vdex_fd);
192*795d594fSAndroid Build Coastguard Worker }
193*795d594fSAndroid Build Coastguard Worker 
PaletteNotifyDexFileLoaded(const char * path)194*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteNotifyDexFileLoaded(const char* path) {
195*795d594fSAndroid Build Coastguard Worker   PaletteNotifyDexFileLoadedMethod m =
196*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteNotifyDexFileLoadedMethod();
197*795d594fSAndroid Build Coastguard Worker   return m(path);
198*795d594fSAndroid Build Coastguard Worker }
199*795d594fSAndroid Build Coastguard Worker 
PaletteNotifyOatFileLoaded(const char * path)200*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteNotifyOatFileLoaded(const char* path) {
201*795d594fSAndroid Build Coastguard Worker   PaletteNotifyOatFileLoadedMethod m =
202*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteNotifyOatFileLoadedMethod();
203*795d594fSAndroid Build Coastguard Worker   return m(path);
204*795d594fSAndroid Build Coastguard Worker }
205*795d594fSAndroid Build Coastguard Worker 
PaletteShouldReportJniInvocations(bool * value)206*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteShouldReportJniInvocations(bool* value) {
207*795d594fSAndroid Build Coastguard Worker   PaletteShouldReportJniInvocationsMethod m =
208*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteShouldReportJniInvocationsMethod();
209*795d594fSAndroid Build Coastguard Worker   return m(value);
210*795d594fSAndroid Build Coastguard Worker }
211*795d594fSAndroid Build Coastguard Worker 
PaletteNotifyBeginJniInvocation(JNIEnv * env)212*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteNotifyBeginJniInvocation(JNIEnv* env) {
213*795d594fSAndroid Build Coastguard Worker   PaletteNotifyBeginJniInvocationMethod m =
214*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteNotifyBeginJniInvocationMethod();
215*795d594fSAndroid Build Coastguard Worker   return m(env);
216*795d594fSAndroid Build Coastguard Worker }
217*795d594fSAndroid Build Coastguard Worker 
PaletteNotifyEndJniInvocation(JNIEnv * env)218*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteNotifyEndJniInvocation(JNIEnv* env) {
219*795d594fSAndroid Build Coastguard Worker   PaletteNotifyEndJniInvocationMethod m =
220*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteNotifyEndJniInvocationMethod();
221*795d594fSAndroid Build Coastguard Worker   return m(env);
222*795d594fSAndroid Build Coastguard Worker }
223*795d594fSAndroid Build Coastguard Worker 
224*795d594fSAndroid Build Coastguard Worker // Introduced in version 2 API, corresponding to SDK level 33.
PaletteReportLockContention(JNIEnv * env,int32_t wait_ms,const char * filename,int32_t line_number,const char * method_name,const char * owner_filename,int32_t owner_line_number,const char * owner_method_name,const char * proc_name,const char * thread_name)225*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteReportLockContention(JNIEnv* env,
226*795d594fSAndroid Build Coastguard Worker                                              int32_t wait_ms,
227*795d594fSAndroid Build Coastguard Worker                                              const char* filename,
228*795d594fSAndroid Build Coastguard Worker                                              int32_t line_number,
229*795d594fSAndroid Build Coastguard Worker                                              const char* method_name,
230*795d594fSAndroid Build Coastguard Worker                                              const char* owner_filename,
231*795d594fSAndroid Build Coastguard Worker                                              int32_t owner_line_number,
232*795d594fSAndroid Build Coastguard Worker                                              const char* owner_method_name,
233*795d594fSAndroid Build Coastguard Worker                                              const char* proc_name,
234*795d594fSAndroid Build Coastguard Worker                                              const char* thread_name) {
235*795d594fSAndroid Build Coastguard Worker   PaletteReportLockContentionMethod m =
236*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteReportLockContentionMethod();
237*795d594fSAndroid Build Coastguard Worker   return m(env,
238*795d594fSAndroid Build Coastguard Worker            wait_ms,
239*795d594fSAndroid Build Coastguard Worker            filename,
240*795d594fSAndroid Build Coastguard Worker            line_number,
241*795d594fSAndroid Build Coastguard Worker            method_name,
242*795d594fSAndroid Build Coastguard Worker            owner_filename,
243*795d594fSAndroid Build Coastguard Worker            owner_line_number,
244*795d594fSAndroid Build Coastguard Worker            owner_method_name,
245*795d594fSAndroid Build Coastguard Worker            proc_name,
246*795d594fSAndroid Build Coastguard Worker            thread_name);
247*795d594fSAndroid Build Coastguard Worker }
248*795d594fSAndroid Build Coastguard Worker 
249*795d594fSAndroid Build Coastguard Worker // Introduced in version 3 API, corresponding to SDK level 34.
PaletteSetTaskProfiles(int32_t tid,const char * const profiles[],size_t profiles_len)250*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteSetTaskProfiles(int32_t tid,
251*795d594fSAndroid Build Coastguard Worker                                         const char* const profiles[],
252*795d594fSAndroid Build Coastguard Worker                                         size_t profiles_len) {
253*795d594fSAndroid Build Coastguard Worker   PaletteSetTaskProfilesMethod m = PaletteLoader::Instance().GetPaletteSetTaskProfilesMethod();
254*795d594fSAndroid Build Coastguard Worker   return m(tid, profiles, profiles_len);
255*795d594fSAndroid Build Coastguard Worker }
256*795d594fSAndroid Build Coastguard Worker 
257*795d594fSAndroid Build Coastguard Worker // Methods in version 4 API, corresponding to SDK level 36.
PaletteDebugStoreGetString(char * result,size_t max_size)258*795d594fSAndroid Build Coastguard Worker palette_status_t PaletteDebugStoreGetString(char* result, size_t max_size) {
259*795d594fSAndroid Build Coastguard Worker   PaletteDebugStoreGetStringMethod m =
260*795d594fSAndroid Build Coastguard Worker       PaletteLoader::Instance().GetPaletteDebugStoreGetStringMethod();
261*795d594fSAndroid Build Coastguard Worker   return m(result, max_size);
262*795d594fSAndroid Build Coastguard Worker }
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker }  // extern "C"
265