1 /*
2  * Copyright (C) 2011-2012 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 #define LOG_TAG "libDispatch"
17 #include <android/log.h>
18 
19 #include "rsDispatch.h"
20 #include <dlfcn.h>
21 #include <limits.h>
22 
23 #define LOG_ERR(...) __android_log_print(ANDROID_LOG_ERROR, "RS Dispatch", __VA_ARGS__);
24 #define REDUCE_API_LEVEL 24
25 
loadSymbols(void * handle,dispatchTable & dispatchTab,int targetApiLevel)26 bool loadSymbols(void* handle, dispatchTable& dispatchTab, int targetApiLevel) {
27 #ifdef __LP64__
28     // Function to set the native lib path for 64bit compat lib.
29     dispatchTab.SetNativeLibDir = (SetNativeLibDirFnPtr)dlsym(handle, "rsaContextSetNativeLibDir");
30     if (dispatchTab.SetNativeLibDir == nullptr) {
31         LOG_ERR("Couldn't initialize dispatchTab.SetNativeLibDir");
32         return false;
33     }
34 #endif
35 
36     dispatchTab.Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData");
37     dispatchTab.Allocation1DElementData = (Allocation1DElementDataFnPtr)dlsym(handle, "rsAllocation1DElementData");
38     dispatchTab.Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead");
39     dispatchTab.Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData");
40     dispatchTab.Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead");
41     dispatchTab.Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData");
42     dispatchTab.Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead");
43     dispatchTab.AllocationAdapterCreate = (AllocationAdapterCreateFnPtr)dlsym(handle, "rsAllocationAdapterCreate");
44     dispatchTab.AllocationAdapterOffset = (AllocationAdapterOffsetFnPtr)dlsym(handle, "rsAllocationAdapterOffset");
45     dispatchTab.AllocationCopy2DRange = (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange");
46     dispatchTab.AllocationCopy3DRange = (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange");
47     dispatchTab.AllocationCopyToBitmap = (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap");
48     dispatchTab.AllocationCreateFromBitmap = (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap");
49     dispatchTab.AllocationCreateTyped = (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped");
50     dispatchTab.AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCubeCreateFromBitmap");
51     dispatchTab.AllocationElementData = (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData");
52     dispatchTab.AllocationElementRead = (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead");
53     dispatchTab.AllocationGenerateMipmaps = (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps");
54     dispatchTab.AllocationGetPointer = (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer");
55     dispatchTab.AllocationGetSurface = (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface");
56     dispatchTab.AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType");
57     dispatchTab.AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive");
58     dispatchTab.AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend");
59     dispatchTab.AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead");
60     dispatchTab.AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D");
61     dispatchTab.AllocationSetSurface = (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface");
62     dispatchTab.AllocationSetupBufferQueue = (AllocationSetupBufferQueueFnPtr)dlsym(handle, "rsAllocationSetupBufferQueue");
63     dispatchTab.AllocationShareBufferQueue = (AllocationShareBufferQueueFnPtr)dlsym(handle, "rsAllocationShareBufferQueue");
64     dispatchTab.AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll");
65     dispatchTab.AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName");
66     dispatchTab.ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate");
67     dispatchTab.ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg");
68     dispatchTab.ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal");
69     dispatchTab.ContextCreate = (ContextCreateFnPtr)dlsym(handle, "rsContextCreate");;
70     dispatchTab.ContextDeinitToClient = (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient");
71     dispatchTab.ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy");
72     dispatchTab.ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump");
73     dispatchTab.ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish");
74     dispatchTab.ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage");
75     dispatchTab.ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient");
76     dispatchTab.ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage");
77     dispatchTab.ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage");
78     dispatchTab.ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority");
79     dispatchTab.ContextSetCacheDir = (ContextSetCacheDirFnPtr)dlsym(handle, "rsContextSetCacheDir");
80     dispatchTab.DeviceCreate = (DeviceCreateFnPtr)dlsym(handle, "rsDeviceCreate");
81     dispatchTab.DeviceDestroy = (DeviceDestroyFnPtr)dlsym(handle, "rsDeviceDestroy");
82     dispatchTab.DeviceSetConfig = (DeviceSetConfigFnPtr)dlsym(handle, "rsDeviceSetConfig");
83     dispatchTab.ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate");
84     dispatchTab.ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2");
85     dispatchTab.ElementGetNativeData = (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData");
86     dispatchTab.ElementGetSubElements = (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements");
87     dispatchTab.GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName");;
88     dispatchTab.InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate");
89     dispatchTab.ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy");
90     dispatchTab.SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate");
91     dispatchTab.ScriptBindAllocation = (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation");
92     dispatchTab.ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate");
93     dispatchTab.ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate");
94     dispatchTab.ScriptForEach = (ScriptForEachFnPtr)dlsym(handle, "rsScriptForEach");
95     dispatchTab.ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti");
96     dispatchTab.ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV");
97     dispatchTab.ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create");
98     dispatchTab.ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate");
99     dispatchTab.ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute");
100     dispatchTab.ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput");
101     dispatchTab.ScriptGroupSetOutput = (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput");
102     dispatchTab.ScriptIntrinsicCreate = (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate");
103     dispatchTab.ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke");
104     dispatchTab.ScriptInvokeIDCreate = (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate");
105     dispatchTab.ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV");
106     dispatchTab.ScriptKernelIDCreate = (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate");
107     dispatchTab.ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce");
108     dispatchTab.ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone");
109     dispatchTab.ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD");
110     dispatchTab.ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF");
111     dispatchTab.ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI");
112     dispatchTab.ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ");
113     dispatchTab.ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj");
114     dispatchTab.ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV");
115     dispatchTab.ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE");
116     dispatchTab.TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate");
117     dispatchTab.TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData");
118 
119     // Load graphics APIs
120     dispatchTab.ContextCreateGL = (ContextCreateGLFnPtr)dlsym(handle, "rsContextCreateGL");
121     dispatchTab.ContextSetSurface = (ContextSetSurfaceFnPtr)dlsym(handle, "rsContextSetSurface");
122     dispatchTab.ContextPause = (ContextPauseFnPtr)dlsym(handle, "rsContextPause");
123     dispatchTab.ContextResume = (ContextResumeFnPtr)dlsym(handle, "rsContextResume");
124     dispatchTab.ContextBindProgramStore = (ContextBindProgramStoreFnPtr)dlsym(handle, "rsContextBindProgramStore");
125     dispatchTab.ContextBindProgramFragment = (ContextBindProgramFragmentFnPtr)dlsym(handle, "rsContextBindProgramFragment");
126     dispatchTab.ContextBindProgramVertex = (ContextBindProgramVertexFnPtr)dlsym(handle, "rsContextBindProgramVertex");
127     dispatchTab.ContextBindProgramRaster = (ContextBindProgramRasterFnPtr)dlsym(handle, "rsContextBindProgramRaster");
128     dispatchTab.ContextBindFont = (ContextBindFontFnPtr)dlsym(handle, "rsContextBindFont");
129     dispatchTab.ContextBindRootScript = (ContextBindRootScriptFnPtr)dlsym(handle, "rsContextBindRootScript");
130 
131     dispatchTab.ProgramStoreCreate = (ProgramStoreCreateFnPtr)dlsym(handle, "rsProgramStoreCreate");
132     dispatchTab.ProgramRasterCreate = (ProgramRasterCreateFnPtr)dlsym(handle, "rsProgramRasterCreate");
133     dispatchTab.ProgramBindConstants = (ProgramBindConstantsFnPtr)dlsym(handle, "rsProgramBindConstants");
134     dispatchTab.ProgramBindTexture = (ProgramBindTextureFnPtr)dlsym(handle, "rsProgramBindTexture");
135     dispatchTab.ProgramBindSampler = (ProgramBindSamplerFnPtr)dlsym(handle, "rsProgramBindSampler");
136     dispatchTab.ProgramFragmentCreate = (ProgramFragmentCreateFnPtr)dlsym(handle, "rsProgramFragmentCreate");
137     dispatchTab.ProgramVertexCreate = (ProgramVertexCreateFnPtr)dlsym(handle, "rsProgramVertexCreate");
138     dispatchTab.FontCreateFromFile = (FontCreateFromFileFnPtr)dlsym(handle, "rsFontCreateFromFile");
139     dispatchTab.FontCreateFromMemory = (FontCreateFromMemoryFnPtr)dlsym(handle, "rsFontCreateFromMemory");
140     dispatchTab.MeshCreate = (MeshCreateFnPtr)dlsym(handle, "rsMeshCreate");
141     dispatchTab.MeshGetVertexBufferCount = (MeshGetVertexBufferCountFnPtr)dlsym(handle, "rsaMeshGetVertexBufferCount");
142     dispatchTab.MeshGetIndexCount = (MeshGetIndexCountFnPtr)dlsym(handle, "rsaMeshGetIndexCount");
143     dispatchTab.MeshGetVertices = (MeshGetVerticesFnPtr)dlsym(handle, "rsaMeshGetVertices");
144     dispatchTab.MeshGetIndices = (MeshGetIndicesFnPtr)dlsym(handle, "rsaMeshGetIndices");
145     dispatchTab.FileA3DGetEntryByIndex = (FileA3DGetEntryByIndexFnPtr)dlsym(handle, "rsaFileA3DGetEntryByIndex");
146     dispatchTab.FileA3DGetNumIndexEntries = (FileA3DGetNumIndexEntriesFnPtr)dlsym(handle, "rsaFileA3DGetNumIndexEntries");
147     dispatchTab.FileA3DGetIndexEntries = (FileA3DGetIndexEntriesFnPtr)dlsym(handle, "rsaFileA3DGetIndexEntries");
148     dispatchTab.FileA3DCreateFromMemory = (FileA3DCreateFromMemoryFnPtr)dlsym(handle, "rsaFileA3DCreateFromMemory");
149     dispatchTab.FileA3DCreateFromAsset = (FileA3DCreateFromAssetFnPtr)dlsym(handle, "rsaFileA3DCreateFromAsset");
150     dispatchTab.FileA3DCreateFromFile = (FileA3DCreateFromFileFnPtr)dlsym(handle, "rsaFileA3DCreateFromFile");
151 
152     // Clear error buffer for later operations.
153     dlerror();
154 
155     if (dispatchTab.AllocationGetType == nullptr) {
156         LOG_ERR("Couldn't initialize dispatchTab.AllocationGetType");
157         return false;
158     }
159     if (dispatchTab.TypeGetNativeData == nullptr) {
160         LOG_ERR("Couldn't initialize dispatchTab.TypeGetNativeData");
161         return false;
162     }
163     if (dispatchTab.ElementGetNativeData == nullptr) {
164         LOG_ERR("Couldn't initialize dispatchTab.ElementGetNativeData");
165         return false;
166     }
167     if (dispatchTab.ElementGetSubElements == nullptr) {
168         LOG_ERR("Couldn't initialize dispatchTab.ElementGetSubElements");
169         return false;
170     }
171     if (dispatchTab.DeviceCreate == nullptr) {
172         LOG_ERR("Couldn't initialize dispatchTab.DeviceCreate");
173         return false;
174     }
175     if (dispatchTab.DeviceDestroy == nullptr) {
176         LOG_ERR("Couldn't initialize dispatchTab.DeviceDestroy");
177         return false;
178     }
179     if (dispatchTab.DeviceSetConfig == nullptr) {
180         LOG_ERR("Couldn't initialize dispatchTab.DeviceSetConfig");
181         return false;
182     }
183     if (dispatchTab.ContextCreate == nullptr) {
184         LOG_ERR("Couldn't initialize dispatchTab.ContextCreate");
185         return false;
186     }
187     if (dispatchTab.GetName == nullptr) {
188         LOG_ERR("Couldn't initialize dispatchTab.GetName");
189         return false;
190     }
191     if (dispatchTab.ContextDestroy == nullptr) {
192         LOG_ERR("Couldn't initialize dispatchTab.ContextDestroy");
193         return false;
194     }
195     if (dispatchTab.ContextGetMessage == nullptr) {
196         LOG_ERR("Couldn't initialize dispatchTab.ContextGetMessage");
197         return false;
198     }
199     if (dispatchTab.ContextPeekMessage == nullptr) {
200         LOG_ERR("Couldn't initialize dispatchTab.ContextPeekMessage");
201         return false;
202     }
203     if (dispatchTab.ContextSendMessage == nullptr) {
204         LOG_ERR("Couldn't initialize dispatchTab.ContextSendMessage");
205         return false;
206     }
207     if (dispatchTab.ContextInitToClient == nullptr) {
208         LOG_ERR("Couldn't initialize dispatchTab.ContextInitToClient");
209         return false;
210     }
211     if (dispatchTab.ContextDeinitToClient == nullptr) {
212         LOG_ERR("Couldn't initialize dispatchTab.ContextDeinitToClient");
213         return false;
214     }
215     if (dispatchTab.TypeCreate == nullptr) {
216         LOG_ERR("Couldn't initialize dispatchTab.TypeCreate");
217         return false;
218     }
219     if (dispatchTab.AllocationCreateTyped == nullptr) {
220         LOG_ERR("Couldn't initialize dispatchTab.AllocationCreateTyped");
221         return false;
222     }
223     if (dispatchTab.AllocationCreateFromBitmap == nullptr) {
224         LOG_ERR("Couldn't initialize dispatchTab.AllocationCreateFromBitmap");
225         return false;
226     }
227     if (dispatchTab.AllocationCubeCreateFromBitmap == nullptr) {
228         LOG_ERR("Couldn't initialize dispatchTab.AllocationCubeCreateFromBitmap");
229         return false;
230     }
231     if (dispatchTab.AllocationGetSurface == nullptr) {
232         LOG_ERR("Couldn't initialize dispatchTab.AllocationGetSurface");
233         return false;
234     }
235     if (dispatchTab.AllocationSetSurface == nullptr) {
236         LOG_ERR("Couldn't initialize dispatchTab.AllocationSetSurface");
237         return false;
238     }
239     if (dispatchTab.ContextFinish == nullptr) {
240         LOG_ERR("Couldn't initialize dispatchTab.ContextFinish");
241         return false;
242     }
243     if (dispatchTab.ContextDump == nullptr) {
244         LOG_ERR("Couldn't initialize dispatchTab.ContextDump");
245         return false;
246     }
247     if (dispatchTab.ContextSetPriority == nullptr) {
248         LOG_ERR("Couldn't initialize dispatchTab.ContextSetPriority");
249         return false;
250     }
251     if (dispatchTab.AssignName == nullptr) {
252         LOG_ERR("Couldn't initialize dispatchTab.AssignName");
253         return false;
254     }
255     if (dispatchTab.ObjDestroy == nullptr) {
256         LOG_ERR("Couldn't initialize dispatchTab.ObjDestroy");
257         return false;
258     }
259     if (dispatchTab.ElementCreate == nullptr) {
260         LOG_ERR("Couldn't initialize dispatchTab.ElementCreate");
261         return false;
262     }
263     if (dispatchTab.ElementCreate2 == nullptr) {
264         LOG_ERR("Couldn't initialize dispatchTab.ElementCreate2");
265         return false;
266     }
267     if (dispatchTab.AllocationCopyToBitmap == nullptr) {
268         LOG_ERR("Couldn't initialize dispatchTab.AllocationCopyToBitmap");
269         return false;
270     }
271     if (dispatchTab.Allocation1DData == nullptr) {
272         LOG_ERR("Couldn't initialize dispatchTab.Allocation1DData");
273         return false;
274     }
275     if (dispatchTab.Allocation1DElementData == nullptr) {
276         LOG_ERR("Couldn't initialize dispatchTab.Allocation1DElementData");
277         return false;
278     }
279     if (dispatchTab.Allocation2DData == nullptr) {
280         LOG_ERR("Couldn't initialize dispatchTab.Allocation2DData");
281         return false;
282     }
283     if (dispatchTab.Allocation3DData == nullptr) {
284         LOG_ERR("Couldn't initialize dispatchTab.Allocation3DData");
285         return false;
286     }
287     if (dispatchTab.AllocationGenerateMipmaps == nullptr) {
288         LOG_ERR("Couldn't initialize dispatchTab.AllocationGenerateMipmaps");
289         return false;
290     }
291     if (dispatchTab.AllocationRead == nullptr) {
292         LOG_ERR("Couldn't initialize dispatchTab.AllocationRead");
293         return false;
294     }
295     if (dispatchTab.Allocation1DRead == nullptr) {
296         LOG_ERR("Couldn't initialize dispatchTab.Allocation1DRead");
297         return false;
298     }
299     if (dispatchTab.Allocation2DRead == nullptr) {
300         LOG_ERR("Couldn't initialize dispatchTab.Allocation2DRead");
301         return false;
302     }
303     if (dispatchTab.AllocationSyncAll == nullptr) {
304         LOG_ERR("Couldn't initialize dispatchTab.AllocationSyncAll");
305         return false;
306     }
307     if (dispatchTab.AllocationResize1D == nullptr) {
308         LOG_ERR("Couldn't initialize dispatchTab.AllocationResize1D");
309         return false;
310     }
311     if (dispatchTab.AllocationCopy2DRange == nullptr) {
312         LOG_ERR("Couldn't initialize dispatchTab.AllocationCopy2DRange");
313         return false;
314     }
315     if (dispatchTab.AllocationCopy3DRange == nullptr) {
316         LOG_ERR("Couldn't initialize dispatchTab.AllocationCopy3DRange");
317         return false;
318     }
319     if (dispatchTab.SamplerCreate == nullptr) {
320         LOG_ERR("Couldn't initialize dispatchTab.SamplerCreate");
321         return false;
322     }
323     if (dispatchTab.ScriptBindAllocation == nullptr) {
324         LOG_ERR("Couldn't initialize dispatchTab.ScriptBindAllocation");
325         return false;
326     }
327     if (dispatchTab.ScriptSetTimeZone == nullptr) {
328         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetTimeZone");
329         return false;
330     }
331     if (dispatchTab.ScriptInvoke == nullptr) {
332         LOG_ERR("Couldn't initialize dispatchTab.ScriptInvoke");
333         return false;
334     }
335     if (dispatchTab.ScriptInvokeV == nullptr) {
336         LOG_ERR("Couldn't initialize dispatchTab.ScriptInvokeV");
337         return false;
338     }
339     if (dispatchTab.ScriptForEach == nullptr) {
340         LOG_ERR("Couldn't initialize dispatchTab.ScriptForEach");
341         return false;
342     }
343     if (dispatchTab.ScriptSetVarI == nullptr) {
344         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarI");
345         return false;
346     }
347     if (dispatchTab.ScriptSetVarObj == nullptr) {
348         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarObj");
349         return false;
350     }
351     if (dispatchTab.ScriptSetVarJ == nullptr) {
352         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarJ");
353         return false;
354     }
355     if (dispatchTab.ScriptSetVarF == nullptr) {
356         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarF");
357         return false;
358     }
359     if (dispatchTab.ScriptSetVarD == nullptr) {
360         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarD");
361         return false;
362     }
363     if (dispatchTab.ScriptSetVarV == nullptr) {
364         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarV");
365         return false;
366     }
367     if (dispatchTab.ScriptGetVarV == nullptr) {
368         LOG_ERR("Couldn't initialize dispatchTab.ScriptGetVarV");
369         return false;
370     }
371     if (dispatchTab.ScriptSetVarVE == nullptr) {
372         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarVE");
373         return false;
374     }
375     if (dispatchTab.ScriptCCreate == nullptr) {
376         LOG_ERR("Couldn't initialize dispatchTab.ScriptCCreate");
377         return false;
378     }
379     if (dispatchTab.ScriptIntrinsicCreate == nullptr) {
380         LOG_ERR("Couldn't initialize dispatchTab.ScriptIntrinsicCreate");
381         return false;
382     }
383     if (dispatchTab.ScriptKernelIDCreate == nullptr) {
384         LOG_ERR("Couldn't initialize dispatchTab.ScriptKernelIDCreate");
385         return false;
386     }
387     if (dispatchTab.ScriptFieldIDCreate == nullptr) {
388         LOG_ERR("Couldn't initialize dispatchTab.ScriptFieldIDCreate");
389         return false;
390     }
391     if (dispatchTab.ScriptGroupCreate == nullptr) {
392         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupCreate");
393         return false;
394     }
395     if (dispatchTab.ScriptGroupSetOutput == nullptr) {
396         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupSetOutput");
397         return false;
398     }
399     if (dispatchTab.ScriptGroupSetInput == nullptr) {
400         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupSetInput");
401         return false;
402     }
403     if (dispatchTab.ScriptGroupExecute == nullptr) {
404         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupExecute");
405         return false;
406     }
407     if (dispatchTab.AllocationIoSend == nullptr) {
408         LOG_ERR("Couldn't initialize dispatchTab.AllocationIoSend");
409         return false;
410     }
411     if (dispatchTab.AllocationIoReceive == nullptr) {
412         LOG_ERR("Couldn't initialize dispatchTab.AllocationIoReceive");
413         return false;
414     }
415     // API_21 functions
416     if (targetApiLevel >= 21) {
417         if (dispatchTab.AllocationGetPointer == nullptr) {
418             LOG_ERR("Couldn't initialize dispatchTab.AllocationGetPointer");
419             return false;
420         }
421     }
422     // API_23 functions
423     if (targetApiLevel >= 23) {
424         // ScriptGroup V2 functions
425         if (dispatchTab.ScriptInvokeIDCreate == nullptr) {
426             LOG_ERR("Couldn't initialize dispatchTab.ScriptInvokeIDCreate");
427             return false;
428         }
429         if (dispatchTab.ClosureCreate == nullptr) {
430             LOG_ERR("Couldn't initialize dispatchTab.ClosureCreate");
431             return false;
432         }
433         if (dispatchTab.InvokeClosureCreate == nullptr) {
434             LOG_ERR("Couldn't initialize dispatchTab.InvokeClosureCreate");
435             return false;
436         }
437         if (dispatchTab.ClosureSetArg == nullptr) {
438             LOG_ERR("Couldn't initialize dispatchTab.ClosureSetArg");
439             return false;
440         }
441         if (dispatchTab.ClosureSetGlobal == nullptr) {
442             LOG_ERR("Couldn't initialize dispatchTab.ClosureSetGlobal");
443             return false;
444         }
445         if (dispatchTab.ScriptGroup2Create == nullptr) {
446             LOG_ERR("Couldn't initialize dispatchTab.ScriptGroup2Create");
447             return false;
448         }
449         if (dispatchTab.AllocationElementData == nullptr) {
450             LOG_ERR("Couldn't initialize dispatchTab.AllocationElementData");
451             return false;
452         }
453         if (dispatchTab.AllocationElementRead == nullptr) {
454             LOG_ERR("Couldn't initialize dispatchTab.AllocationElementRead");
455             return false;
456         }
457         if (dispatchTab.Allocation3DRead == nullptr) {
458             LOG_ERR("Couldn't initialize dispatchTab.Allocation3DRead");
459             return false;
460         }
461         if (dispatchTab.ScriptForEachMulti == nullptr) {
462             LOG_ERR("Couldn't initialize dispatchTab.ScriptForEachMulti");
463             return false;
464         }
465     }
466 
467     if (targetApiLevel >= REDUCE_API_LEVEL) {
468         if (dispatchTab.ScriptReduce == nullptr) {
469             LOG_ERR("Couldn't initialize dispatchTab.ScriptReduce");
470             return false;
471         }
472     }
473 
474     return true;
475 
476 }
477 
478 
loadIOSuppSyms(void * handleIO,ioSuppDT & ioDispatch)479 bool loadIOSuppSyms(void* handleIO, ioSuppDT& ioDispatch){
480     ioDispatch.sAllocationSetSurface = (sAllocationSetSurfaceFnPtr)dlsym(handleIO, "AllocationSetSurface");
481     if (ioDispatch.sAllocationSetSurface == nullptr) {
482         LOG_ERR("Couldn't initialize ioDispatch.sAllocationSetSurface");
483         return false;
484     }
485     return true;
486 }