[Top][All Lists]
[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) {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cinvoke-svn] r67 - trunk/cinvoke/bindings/java,
will <=