cinvoke-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cinvoke-svn] r67 - trunk/cinvoke/bindings/java


From: will
Subject: [cinvoke-svn] r67 - trunk/cinvoke/bindings/java
Date: 3 Jul 2006 12:08:42 -0400

Author: will
Date: 2006-07-03 12:08:41 -0400 (Mon, 03 Jul 2006)
New Revision: 67

Modified:
   trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp
Log:
native methods finished (?)


Modified: trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp
===================================================================
--- trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp 2006-07-03 05:05:33 UTC 
(rev 66)
+++ trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp 2006-07-03 16:08:41 UTC 
(rev 67)
@@ -462,20 +462,65 @@
        jobjectArray pclasses, jintArray ptypes, jboolean hasret, jint rettype) 
{
        CInvContext *ctx = (CInvContext *)c;
        CInvFunction *func = (CInvFunction *)f;
+       jobject ref = NULL;
+       ud *u = NULL;
+       int numparms = 0;
+       int *typearr = NULL;
+       jclass *clsarr = NULL;
 
-       jobject ref = env->NewGlobalRef(cbthunk);
+       ref = env->NewGlobalRef(cbthunk);
        if (!ref)
-               return 0;
+               goto error;
+       numparms = env->GetArrayLength(pclasses);
+       if (env->ExceptionOccurred())
+               goto error;
+       typearr = (int *)malloc(sizeof(int) * numparms);
+       if (!typearr)
+               goto error;
+       jint *tel = env->GetIntArrayElements(ptypes, NULL);
+       if (!tel)
+               goto error;
+       for (int i = 0; i < numparms; i++)
+               typearr[i] = tel[i];
+       env->ReleaseIntArrayElements(ptypes, tel, 0);
+       clsarr = (jclass*)malloc(sizeof(jclass) * numparms);
+       if (!clsarr)
+               goto error;
+       for (int i = 0; i < numparms; i++)
+               clsarr[i] = NULL;
+       for (int i = 0; i < numparms; i++) {
+               jclass cls = (jclass)env->GetObjectArrayElement(pclasses, i);
+               if (!cls)
+                       goto error;
+               clsarr[i] = (jclass)env->NewGlobalRef(cls);
+               if (!clsarr[i])
+                       goto error;
+       }
+       u = new ud();
+       if (!u)
+               goto error;
 
-       ud *u = new ud();
-       if (!u)
-               return 0;
-       else {
-               u->env = env;
-               u->ref = ref;
-               // XXX numparms, pclasses, ptypes, rettype, hasretval
-               return (jlong)cinv_callback_create(ctx, func, u, cbfunc);
+       u->env = env;
+       u->ref = ref;
+       u->numparms = numparms;
+       u->rettype = rettype;
+       u->hasretval = hasret;
+       u->ptypes = typearr;
+       u->pclasses = clsarr;
+       return (jlong)cinv_callback_create(ctx, func, u, cbfunc);
+error:
+       if (ref)
+               env->DeleteGlobalRef(ref);
+       free(typearr);
+       if (clsarr) {
+               for (int i = 0; i < u->numparms; i++) {
+                       if (clsarr[i])
+                               env->DeleteGlobalRef(clsarr[i]);
+               }
+               free(clsarr);
        }
+       delete u;
+       return 0;
 }
 JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_getEPCallback(
        JNIEnv *env, jclass, jlong c, jlong b) {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]