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
26bool 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
479bool 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}