theKernel 10.0
Loading...
Searching...
No Matches
MkCall_jv.c
Go to the documentation of this file.
1
9/* LABEL-NO */
10
11#include <jni.h>
12#include "LibMkKernel_jv.h"
13
15MK(ProcCreate) (
17 JNIEnv* env,
18 jobject object,
19 jclass class,
20 jmethodID method,
21 bool hasArg
22)
23{
24 if (object == NULL && class == NULL) {
25 return NULL;
26 }
27 struct MkProcCallS * call = MkSysCalloc(MK_ERROR_PANIC, 1, sizeof(*call));
28 if (object != NULL) {
29 JavaErrorCheckNULL (call->object = (*env)->NewGlobalRef(env, object));
30 }
31 if (class != NULL) {
32 JavaErrorCheckNULL (call->class = (*env)->NewGlobalRef(env, class));
33 }
34 call->mkrt = mkrt;
35 call->hasArg = hasArg;
36 call->env = env;
37 call->method = method;
38 return call;
39error:
40 if (call->object) (*env)->DeleteGlobalRef(env, call->object);
41 if (call->class) (*env)->DeleteGlobalRef(env, call->class);
42 MkSysFree(call);
43 return NULL;
44}
45
46void MK(ProcFree) (struct MkProcCallS ** callP)
47{
48 if (callP == NULL) return;
49 struct MkProcCallS * call = *callP;
50 JNIEnv *env = call->env;
51 if (call->object != NULL) (*env)->DeleteGlobalRef(env, call->object);
52 if (call->class != NULL) (*env)->DeleteGlobalRef(env, call->class );
53 MkSysFree(*callP);
54}
55
56// ===============================================================================================
57
58void MK_DECL
59NS(ObjectDeleteFree) ( MkObjectDeleteFreeF_ARGS )
60{
61 if (dataP == NULL) return;
62 MK(ProcFree)((struct MkProcCallS **)dataP);
63}
64
66NS(ObjectDeleteCall) ( MkObjectDeleteCallF_ARGS )
67{
69
70 // if NO self object is available than NO callback is called
71 if (!MkSelfExists(obj)) return MK_OK;
72
73 struct MkProcCallS const * const call = (struct MkProcCallS const * const) __data__;
74 JNIEnv *env = call->env;
75
76 jstring typeNameO = (*env)->NewStringUTF(env,typeName);
77
78 // call the function
79 if (call->class == NULL) {
80 // method call of the same class
81 (*env)->CallVoidMethod(env, call->object, call->method, typeNameO, typeHdl, objHdl);
82 } else if (call->object == NULL) {
83 // static method call returning an object
84 (*env)->CallStaticVoidMethod(env, call->class, call->method, typeNameO, typeHdl, objHdl);
85 } else {
86 // method call of an other class
87 (*env)->CallNonvirtualVoidMethod(env, call->object, call->class, call->method, typeNameO, typeHdl, objHdl);
88 }
89
90 // check on error
91 if((*env)->ExceptionCheck(env) != JNI_FALSE) {
92 // is the ERROR from "java" or "jvmkkernel"
93 OT_ERROR_LNG_2_META(MkObjectC_TT);
94 }
95 return MkErrorStack_0E_Check();
96}
97
#define MkErrorStack_0E_Check()
#define MK_ERROR_PANIC
#define MK_DECL
MkErrorE
collection for the different error-codes …
@ MK_OK
(persistent) everything is OK.
MK_PTRB * MK_PTR
generic pointer data-type
#define MkObjectC_TT
class as MkTypeS-class-type, useable in a class-macro as: class##_TT …
static bool MkSelfExists(MK_OBJN obj)
Check if the MkObjectS::self exists …
MK_PTR MkSysCalloc(MK_OBJN fmtobj, size_t const nmemb, size_t const size)
calloc syscall with jvmkkernel error plugin
#define MkSysFree(pointer)
#define MkObjectDeleteCallF_CHECK
validate call to MkObjectDeleteCallF
#define MkObjectDeleteCallF_ARGS
the MkObjectDeleteCallF arguments with default names
#define MkObjectDeleteFreeF_ARGS
the MkObjectDeleteFreeF arguments with default names
#define MK_RT_ARGS