Home | History | Annotate | Download | only in cpp
      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 
     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.AllocationCopy2DRange = (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange");
     44     dispatchTab.AllocationCopy3DRange = (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange");
     45     dispatchTab.AllocationCopyToBitmap = (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap");
     46     dispatchTab.AllocationCreateFromBitmap = (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap");
     47     dispatchTab.AllocationCreateTyped = (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped");
     48     dispatchTab.AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCubeCreateFromBitmap");
     49     dispatchTab.AllocationElementData = (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData");
     50     dispatchTab.AllocationElementRead = (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead");
     51     dispatchTab.AllocationGenerateMipmaps = (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps");
     52     dispatchTab.AllocationGetPointer = (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer");
     53     dispatchTab.AllocationGetSurface = (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface");
     54     dispatchTab.AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType");
     55     dispatchTab.AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive");
     56     dispatchTab.AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend");
     57     dispatchTab.AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead");
     58     dispatchTab.AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D");
     59     dispatchTab.AllocationSetSurface = (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface");
     60     dispatchTab.AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll");
     61     dispatchTab.AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName");
     62     dispatchTab.ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate");
     63     dispatchTab.ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg");
     64     dispatchTab.ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal");
     65     dispatchTab.ContextCreate = (ContextCreateFnPtr)dlsym(handle, "rsContextCreate");;
     66     dispatchTab.ContextDeinitToClient = (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient");
     67     dispatchTab.ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy");
     68     dispatchTab.ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump");
     69     dispatchTab.ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish");
     70     dispatchTab.ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage");
     71     dispatchTab.ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient");
     72     dispatchTab.ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage");
     73     dispatchTab.ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage");
     74     dispatchTab.ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority");
     75     dispatchTab.DeviceCreate = (DeviceCreateFnPtr)dlsym(handle, "rsDeviceCreate");
     76     dispatchTab.DeviceDestroy = (DeviceDestroyFnPtr)dlsym(handle, "rsDeviceDestroy");
     77     dispatchTab.DeviceSetConfig = (DeviceSetConfigFnPtr)dlsym(handle, "rsDeviceSetConfig");
     78     dispatchTab.ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate");
     79     dispatchTab.ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2");
     80     dispatchTab.ElementGetNativeData = (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData");
     81     dispatchTab.ElementGetSubElements = (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements");
     82     dispatchTab.GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName");;
     83     dispatchTab.InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate");
     84     dispatchTab.ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy");
     85     dispatchTab.SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate");
     86     dispatchTab.ScriptBindAllocation = (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation");
     87     dispatchTab.ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate");
     88     dispatchTab.ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate");
     89     dispatchTab.ScriptForEach = (ScriptForEachFnPtr)dlsym(handle, "rsScriptForEach");
     90     dispatchTab.ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti");
     91     dispatchTab.ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV");
     92     dispatchTab.ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create");
     93     dispatchTab.ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate");
     94     dispatchTab.ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute");
     95     dispatchTab.ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput");
     96     dispatchTab.ScriptGroupSetOutput = (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput");
     97     dispatchTab.ScriptIntrinsicCreate = (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate");
     98     dispatchTab.ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke");
     99     dispatchTab.ScriptInvokeIDCreate = (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate");
    100     dispatchTab.ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV");
    101     dispatchTab.ScriptKernelIDCreate = (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate");
    102     dispatchTab.ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce");
    103     dispatchTab.ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone");
    104     dispatchTab.ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD");
    105     dispatchTab.ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF");
    106     dispatchTab.ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI");
    107     dispatchTab.ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ");
    108     dispatchTab.ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj");
    109     dispatchTab.ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV");
    110     dispatchTab.ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE");
    111     dispatchTab.TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate");
    112     dispatchTab.TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData");
    113 
    114     // Clear error buffer for later operations.
    115     dlerror();
    116 
    117     if (dispatchTab.AllocationGetType == nullptr) {
    118         LOG_ERR("Couldn't initialize dispatchTab.AllocationGetType");
    119         return false;
    120     }
    121     if (dispatchTab.TypeGetNativeData == nullptr) {
    122         LOG_ERR("Couldn't initialize dispatchTab.TypeGetNativeData");
    123         return false;
    124     }
    125     if (dispatchTab.ElementGetNativeData == nullptr) {
    126         LOG_ERR("Couldn't initialize dispatchTab.ElementGetNativeData");
    127         return false;
    128     }
    129     if (dispatchTab.ElementGetSubElements == nullptr) {
    130         LOG_ERR("Couldn't initialize dispatchTab.ElementGetSubElements");
    131         return false;
    132     }
    133     if (dispatchTab.DeviceCreate == nullptr) {
    134         LOG_ERR("Couldn't initialize dispatchTab.DeviceCreate");
    135         return false;
    136     }
    137     if (dispatchTab.DeviceDestroy == nullptr) {
    138         LOG_ERR("Couldn't initialize dispatchTab.DeviceDestroy");
    139         return false;
    140     }
    141     if (dispatchTab.DeviceSetConfig == nullptr) {
    142         LOG_ERR("Couldn't initialize dispatchTab.DeviceSetConfig");
    143         return false;
    144     }
    145     if (dispatchTab.ContextCreate == nullptr) {
    146         LOG_ERR("Couldn't initialize dispatchTab.ContextCreate");
    147         return false;
    148     }
    149     if (dispatchTab.GetName == nullptr) {
    150         LOG_ERR("Couldn't initialize dispatchTab.GetName");
    151         return false;
    152     }
    153     if (dispatchTab.ContextDestroy == nullptr) {
    154         LOG_ERR("Couldn't initialize dispatchTab.ContextDestroy");
    155         return false;
    156     }
    157     if (dispatchTab.ContextGetMessage == nullptr) {
    158         LOG_ERR("Couldn't initialize dispatchTab.ContextGetMessage");
    159         return false;
    160     }
    161     if (dispatchTab.ContextPeekMessage == nullptr) {
    162         LOG_ERR("Couldn't initialize dispatchTab.ContextPeekMessage");
    163         return false;
    164     }
    165     if (dispatchTab.ContextSendMessage == nullptr) {
    166         LOG_ERR("Couldn't initialize dispatchTab.ContextSendMessage");
    167         return false;
    168     }
    169     if (dispatchTab.ContextInitToClient == nullptr) {
    170         LOG_ERR("Couldn't initialize dispatchTab.ContextInitToClient");
    171         return false;
    172     }
    173     if (dispatchTab.ContextDeinitToClient == nullptr) {
    174         LOG_ERR("Couldn't initialize dispatchTab.ContextDeinitToClient");
    175         return false;
    176     }
    177     if (dispatchTab.TypeCreate == nullptr) {
    178         LOG_ERR("Couldn't initialize dispatchTab.TypeCreate");
    179         return false;
    180     }
    181     if (dispatchTab.AllocationCreateTyped == nullptr) {
    182         LOG_ERR("Couldn't initialize dispatchTab.AllocationCreateTyped");
    183         return false;
    184     }
    185     if (dispatchTab.AllocationCreateFromBitmap == nullptr) {
    186         LOG_ERR("Couldn't initialize dispatchTab.AllocationCreateFromBitmap");
    187         return false;
    188     }
    189     if (dispatchTab.AllocationCubeCreateFromBitmap == nullptr) {
    190         LOG_ERR("Couldn't initialize dispatchTab.AllocationCubeCreateFromBitmap");
    191         return false;
    192     }
    193     if (dispatchTab.AllocationGetSurface == nullptr) {
    194         LOG_ERR("Couldn't initialize dispatchTab.AllocationGetSurface");
    195         return false;
    196     }
    197     if (dispatchTab.AllocationSetSurface == nullptr) {
    198         LOG_ERR("Couldn't initialize dispatchTab.AllocationSetSurface");
    199         return false;
    200     }
    201     if (dispatchTab.ContextFinish == nullptr) {
    202         LOG_ERR("Couldn't initialize dispatchTab.ContextFinish");
    203         return false;
    204     }
    205     if (dispatchTab.ContextDump == nullptr) {
    206         LOG_ERR("Couldn't initialize dispatchTab.ContextDump");
    207         return false;
    208     }
    209     if (dispatchTab.ContextSetPriority == nullptr) {
    210         LOG_ERR("Couldn't initialize dispatchTab.ContextSetPriority");
    211         return false;
    212     }
    213     if (dispatchTab.AssignName == nullptr) {
    214         LOG_ERR("Couldn't initialize dispatchTab.AssignName");
    215         return false;
    216     }
    217     if (dispatchTab.ObjDestroy == nullptr) {
    218         LOG_ERR("Couldn't initialize dispatchTab.ObjDestroy");
    219         return false;
    220     }
    221     if (dispatchTab.ElementCreate == nullptr) {
    222         LOG_ERR("Couldn't initialize dispatchTab.ElementCreate");
    223         return false;
    224     }
    225     if (dispatchTab.ElementCreate2 == nullptr) {
    226         LOG_ERR("Couldn't initialize dispatchTab.ElementCreate2");
    227         return false;
    228     }
    229     if (dispatchTab.AllocationCopyToBitmap == nullptr) {
    230         LOG_ERR("Couldn't initialize dispatchTab.AllocationCopyToBitmap");
    231         return false;
    232     }
    233     if (dispatchTab.Allocation1DData == nullptr) {
    234         LOG_ERR("Couldn't initialize dispatchTab.Allocation1DData");
    235         return false;
    236     }
    237     if (dispatchTab.Allocation1DElementData == nullptr) {
    238         LOG_ERR("Couldn't initialize dispatchTab.Allocation1DElementData");
    239         return false;
    240     }
    241     if (dispatchTab.Allocation2DData == nullptr) {
    242         LOG_ERR("Couldn't initialize dispatchTab.Allocation2DData");
    243         return false;
    244     }
    245     if (dispatchTab.Allocation3DData == nullptr) {
    246         LOG_ERR("Couldn't initialize dispatchTab.Allocation3DData");
    247         return false;
    248     }
    249     if (dispatchTab.AllocationGenerateMipmaps == nullptr) {
    250         LOG_ERR("Couldn't initialize dispatchTab.AllocationGenerateMipmaps");
    251         return false;
    252     }
    253     if (dispatchTab.AllocationRead == nullptr) {
    254         LOG_ERR("Couldn't initialize dispatchTab.AllocationRead");
    255         return false;
    256     }
    257     if (dispatchTab.Allocation1DRead == nullptr) {
    258         LOG_ERR("Couldn't initialize dispatchTab.Allocation1DRead");
    259         return false;
    260     }
    261     if (dispatchTab.Allocation2DRead == nullptr) {
    262         LOG_ERR("Couldn't initialize dispatchTab.Allocation2DRead");
    263         return false;
    264     }
    265     if (dispatchTab.AllocationSyncAll == nullptr) {
    266         LOG_ERR("Couldn't initialize dispatchTab.AllocationSyncAll");
    267         return false;
    268     }
    269     if (dispatchTab.AllocationResize1D == nullptr) {
    270         LOG_ERR("Couldn't initialize dispatchTab.AllocationResize1D");
    271         return false;
    272     }
    273     if (dispatchTab.AllocationCopy2DRange == nullptr) {
    274         LOG_ERR("Couldn't initialize dispatchTab.AllocationCopy2DRange");
    275         return false;
    276     }
    277     if (dispatchTab.AllocationCopy3DRange == nullptr) {
    278         LOG_ERR("Couldn't initialize dispatchTab.AllocationCopy3DRange");
    279         return false;
    280     }
    281     if (dispatchTab.SamplerCreate == nullptr) {
    282         LOG_ERR("Couldn't initialize dispatchTab.SamplerCreate");
    283         return false;
    284     }
    285     if (dispatchTab.ScriptBindAllocation == nullptr) {
    286         LOG_ERR("Couldn't initialize dispatchTab.ScriptBindAllocation");
    287         return false;
    288     }
    289     if (dispatchTab.ScriptSetTimeZone == nullptr) {
    290         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetTimeZone");
    291         return false;
    292     }
    293     if (dispatchTab.ScriptInvoke == nullptr) {
    294         LOG_ERR("Couldn't initialize dispatchTab.ScriptInvoke");
    295         return false;
    296     }
    297     if (dispatchTab.ScriptInvokeV == nullptr) {
    298         LOG_ERR("Couldn't initialize dispatchTab.ScriptInvokeV");
    299         return false;
    300     }
    301     if (dispatchTab.ScriptForEach == nullptr) {
    302         LOG_ERR("Couldn't initialize dispatchTab.ScriptForEach");
    303         return false;
    304     }
    305     if (dispatchTab.ScriptSetVarI == nullptr) {
    306         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarI");
    307         return false;
    308     }
    309     if (dispatchTab.ScriptSetVarObj == nullptr) {
    310         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarObj");
    311         return false;
    312     }
    313     if (dispatchTab.ScriptSetVarJ == nullptr) {
    314         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarJ");
    315         return false;
    316     }
    317     if (dispatchTab.ScriptSetVarF == nullptr) {
    318         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarF");
    319         return false;
    320     }
    321     if (dispatchTab.ScriptSetVarD == nullptr) {
    322         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarD");
    323         return false;
    324     }
    325     if (dispatchTab.ScriptSetVarV == nullptr) {
    326         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarV");
    327         return false;
    328     }
    329     if (dispatchTab.ScriptGetVarV == nullptr) {
    330         LOG_ERR("Couldn't initialize dispatchTab.ScriptGetVarV");
    331         return false;
    332     }
    333     if (dispatchTab.ScriptSetVarVE == nullptr) {
    334         LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarVE");
    335         return false;
    336     }
    337     if (dispatchTab.ScriptCCreate == nullptr) {
    338         LOG_ERR("Couldn't initialize dispatchTab.ScriptCCreate");
    339         return false;
    340     }
    341     if (dispatchTab.ScriptIntrinsicCreate == nullptr) {
    342         LOG_ERR("Couldn't initialize dispatchTab.ScriptIntrinsicCreate");
    343         return false;
    344     }
    345     if (dispatchTab.ScriptKernelIDCreate == nullptr) {
    346         LOG_ERR("Couldn't initialize dispatchTab.ScriptKernelIDCreate");
    347         return false;
    348     }
    349     if (dispatchTab.ScriptFieldIDCreate == nullptr) {
    350         LOG_ERR("Couldn't initialize dispatchTab.ScriptFieldIDCreate");
    351         return false;
    352     }
    353     if (dispatchTab.ScriptGroupCreate == nullptr) {
    354         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupCreate");
    355         return false;
    356     }
    357     if (dispatchTab.ScriptGroupSetOutput == nullptr) {
    358         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupSetOutput");
    359         return false;
    360     }
    361     if (dispatchTab.ScriptGroupSetInput == nullptr) {
    362         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupSetInput");
    363         return false;
    364     }
    365     if (dispatchTab.ScriptGroupExecute == nullptr) {
    366         LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupExecute");
    367         return false;
    368     }
    369     if (dispatchTab.AllocationIoSend == nullptr) {
    370         LOG_ERR("Couldn't initialize dispatchTab.AllocationIoSend");
    371         return false;
    372     }
    373     if (dispatchTab.AllocationIoReceive == nullptr) {
    374         LOG_ERR("Couldn't initialize dispatchTab.AllocationIoReceive");
    375         return false;
    376     }
    377     // API_21 functions
    378     if (targetApiLevel >= 21) {
    379         if (dispatchTab.AllocationGetPointer == nullptr) {
    380             LOG_ERR("Couldn't initialize dispatchTab.AllocationGetPointer");
    381             return false;
    382         }
    383     }
    384     // API_23 functions
    385     if (targetApiLevel >= 23) {
    386         // ScriptGroup V2 functions
    387         if (dispatchTab.ScriptInvokeIDCreate == nullptr) {
    388             LOG_ERR("Couldn't initialize dispatchTab.ScriptInvokeIDCreate");
    389             return false;
    390         }
    391         if (dispatchTab.ClosureCreate == nullptr) {
    392             LOG_ERR("Couldn't initialize dispatchTab.ClosureCreate");
    393             return false;
    394         }
    395         if (dispatchTab.InvokeClosureCreate == nullptr) {
    396             LOG_ERR("Couldn't initialize dispatchTab.InvokeClosureCreate");
    397             return false;
    398         }
    399         if (dispatchTab.ClosureSetArg == nullptr) {
    400             LOG_ERR("Couldn't initialize dispatchTab.ClosureSetArg");
    401             return false;
    402         }
    403         if (dispatchTab.ClosureSetGlobal == nullptr) {
    404             LOG_ERR("Couldn't initialize dispatchTab.ClosureSetGlobal");
    405             return false;
    406         }
    407         if (dispatchTab.ScriptGroup2Create == nullptr) {
    408             LOG_ERR("Couldn't initialize dispatchTab.ScriptGroup2Create");
    409             return false;
    410         }
    411         if (dispatchTab.AllocationElementData == nullptr) {
    412             LOG_ERR("Couldn't initialize dispatchTab.AllocationElementData");
    413             return false;
    414         }
    415         if (dispatchTab.AllocationElementRead == nullptr) {
    416             LOG_ERR("Couldn't initialize dispatchTab.AllocationElementRead");
    417             return false;
    418         }
    419         if (dispatchTab.Allocation3DRead == nullptr) {
    420             LOG_ERR("Couldn't initialize dispatchTab.Allocation3DRead");
    421             return false;
    422         }
    423         if (dispatchTab.ScriptForEachMulti == nullptr) {
    424             LOG_ERR("Couldn't initialize dispatchTab.ScriptForEachMulti");
    425             return false;
    426         }
    427     }
    428 
    429     if (targetApiLevel >= REDUCE_API_LEVEL) {
    430         if (dispatchTab.ScriptReduce == nullptr) {
    431             LOG_ERR("Couldn't initialize dispatchTab.ScriptReduce");
    432             return false;
    433         }
    434     }
    435 
    436     return true;
    437 
    438 }
    439 
    440 
    441 bool loadIOSuppSyms(void* handleIO, ioSuppDT& ioDispatch){
    442     ioDispatch.sAllocationSetSurface = (sAllocationSetSurfaceFnPtr)dlsym(handleIO, "AllocationSetSurface");
    443     if (ioDispatch.sAllocationSetSurface == nullptr) {
    444         LOG_ERR("Couldn't initialize ioDispatch.sAllocationSetSurface");
    445         return false;
    446     }
    447     return true;
    448 }
    449