char __cdecl JavaToObjCCallHandler(DCCallback* callback, DCArgs* args, DCValue* result, void* userdata) { JavaToObjCCallInfo* info = (JavaToObjCCallInfo*)userdata; CallTempStruct* call; jobject instance = initCallHandler(args, &call, NULL, &info->fInfo); JNIEnv* env = call->env; BEGIN_TRY(env, call); call->pCallIOs = info->fInfo.fCallIOs; void* targetId = info->fNativeClass ? JLONG_TO_PTR(info->fNativeClass) : getNativeObjectPointer(env, instance, NULL); void* callback = //objc_msgSend_stret;// objc_msgSend; #if defined(DC__Arch_Intel_x86) switch (info->fInfo.fReturnType) { case eDoubleValue: case eFloatValue: callback = objc_msgSend_fpret; break; } #endif dcMode(call->vm, info->fInfo.fDCMode); dcArgPointer(call->vm, targetId); dcArgPointer(call->vm, info->fSelector); followArgs(call, args, info->fInfo.nParams, info->fInfo.fParamTypes, JNI_FALSE, JNI_TRUE)// TODO isVarArgs ?? && followCall(call, info->fInfo.fReturnType, result, callback, JNI_FALSE, JNI_FALSE); cleanupCallHandler(call); END_TRY_BASE(info->fInfo.fEnv, call, cleanupCallHandler(call););
void __cdecl JavaToCCallHandler_Sub(CallTempStruct* call, JavaToNativeCallbackCallInfo* info, jobject instance, DCArgs* args, DCValue* result) { void* callbackPtr; dcMode(call->vm, info->fInfo.fDCMode); //dcReset(call->vm); callbackPtr = getNativeObjectPointer(call->env, instance, NULL); // printf("doJavaToCCallHandler(callback = %d) !!!\n", callback); callFunction(call, &info->fInfo, args, result, callbackPtr, 0); }
void JavaToVirtualMethodCallHandler_Sub(CallTempStruct* call, VirtualMethodCallInfo* info, jobject instance, DCArgs* args, DCValue* result) { void* callbackFn; void* thisPtr; int nParams = info->fInfo.nParams; ValueType *pParamTypes = info->fInfo.fParamTypes; dcMode(call->vm, info->fInfo.fDCMode); //dcReset(call->vm); if (info->fHasThisPtrArg) { if (nParams == 0 || *pParamTypes != eSizeTValue) { throwException(call->env, "A C++ method must be bound with a method having a first argument of type long !"); return; } thisPtr = dcbArgPointer(args); if (!thisPtr) { throwException(call->env, "Calling a method on a NULL C++ class pointer !"); return; } nParams--; pParamTypes++; } else { thisPtr = getNativeObjectPointer(call->env, instance, info->fClass); if (!thisPtr) { throwException(call->env, "Failed to get the pointer to the target C++ instance of the method invocation !"); return; } //nParams--; //pParamTypes++; } callbackFn = getNthVirtualMethodFromThis(call->env, thisPtr, info->fVirtualTableOffset, info->fVirtualIndex); if (!callbackFn) { throwException(call->env, "Virtual method pointer found in virtual table is NULL !"); return; } dcArgPointer(call->vm, thisPtr); followArgs(call, args, nParams, pParamTypes, NO_FLAGS) && followCall(call, info->fInfo.fReturnType, result, callbackFn, NO_FLAGS); }
void JavaToCPPMethodCallHandler_Sub(CallTempStruct* call, FunctionCallInfo* info, jobject instance, DCArgs* args, DCValue* result) { void* thisPtr; dcMode(call->vm, info->fInfo.fDCMode); //dcReset(call->vm); thisPtr = getNativeObjectPointer(call->env, instance, info->fClass); if (!thisPtr) { throwException(call->env, "Failed to get the pointer to the target C++ instance of the method invocation !"); return; } dcArgPointer(call->vm, thisPtr); callFunction(call, &info->fInfo, args, result, info->fForwardedSymbol, 0); }