cinvoke-svn
[Top][All Lists]
Advanced

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

[cinvoke-svn] r66 - in trunk/cinvoke/bindings/java: . org/cinvoke


From: will
Subject: [cinvoke-svn] r66 - in trunk/cinvoke/bindings/java: . org/cinvoke
Date: 3 Jul 2006 01:05:34 -0400

Author: will
Date: 2006-07-03 01:05:33 -0400 (Mon, 03 Jul 2006)
New Revision: 66

Modified:
   trunk/cinvoke/bindings/java/org/cinvoke/CInvoke.java
   trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp
   trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.h
Log:
more native stuff


Modified: trunk/cinvoke/bindings/java/org/cinvoke/CInvoke.java
===================================================================
--- trunk/cinvoke/bindings/java/org/cinvoke/CInvoke.java        2006-07-03 
03:43:37 UTC (rev 65)
+++ trunk/cinvoke/bindings/java/org/cinvoke/CInvoke.java        2006-07-03 
05:05:33 UTC (rev 66)
@@ -23,6 +23,7 @@
                String name, long type);
        private static native long alloc(int sz);
        private static native void free(long m);
+       private static native int sizeofBasic(int type);
        private static native void writeValue(long m, Object val, int type);
        private static native Object readValue(long m, Class cls, int type);
        private static native int setMemberValueStruct(long ctx, long strct,
@@ -33,9 +34,12 @@
        private static native int sizeStruct(long ctx, long strct);
        private static native int deleteStruct(long ctx, long strct);
        private static native long createCallback(long ctx, long func,
-               CBThunk cbcls);
+               CBThunk cbcls, Class[] pclasses, int[] ptypes, boolean hasret,
+               int rettype);
        private static native long getEPCallback(long ctx, long cb);
        private static native int deleteCallback(long ctx, long cb); 
+       private static native String ptrToStringUTF8(long ptr);
+       private static native String ptrToStringUnicode(long ptr, int numchars);
 
        private class CBThunk {
                public CBThunk() {
@@ -74,12 +78,10 @@
                return null;
        }
        public static String ptrToStringUTF8(Ptr ptr) {
-               // XXX
-               return null;
+               return ptrToStringUTF8(ptr.longValue());
        }
-       public static String ptrToStringUnicode(Ptr ptr) {
-               // XXX
-               return null;
+       public static String ptrToStringUnicode(Ptr ptr, int numchars) {
+               return ptrToStringUnicode(ptr.longValue(), numchars);
        }
        public static Object[] ptrToArray(Ptr ptr, Class type, int num) {
                // XXX

Modified: trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp
===================================================================
--- trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp 2006-07-03 03:43:37 UTC 
(rev 65)
+++ trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.cpp 2006-07-03 05:05:33 UTC 
(rev 66)
@@ -70,48 +70,11 @@
        return ret;
 }
 void *alloc(int type) {
-       int sz = 0;
-
-       switch (type) {
-       case CINV_T_CHAR:
-               sz = 1;
-               break;
-       case CINV_T_SHORT:
-               sz = sizeof(short);
-               break;
-       case CINV_T_INT:
-               sz = sizeof(int);
-               break;
-       case CINV_T_LONG:
-               sz = sizeof(long);
-               break;
-       case CINV_T_EXTRALONG:
-               sz = sizeof(long long);
-               break;
-       case CINV_T_PTR: 
-               sz = sizeof(void *);
-               break;
-       case CINV_T_FLOAT:
-               sz = sizeof(float);
-               break;
-       case CINV_T_DOUBLE:
-               sz = sizeof(double);
-               break;
-       case T_JSHORT:
-               sz = sizeof(jshort);
-               break;
-       case T_JINT:
-               sz = sizeof(jint);
-               break;
-       case T_JLONG:
-               sz = sizeof(jlong);
-               break;
-       }
-
-       return malloc(sz);
+       return malloc(Java_org_cinvoke_CInvoke_sizeofBasic(NULL, NULL, type));
 }
 void fail(JNIEnv *env) {
-       // XXX
+       jclass ex = env->FindClass("java/lang/Exception");
+       env->ThrowNew(ex, "invoke failed");
 }
 JNIEXPORT jobject JNICALL Java_org_cinvoke_CInvoke_invokeFunction(
        JNIEnv *env, jclass, jlong c, jlong f, jlong e, jobjectArray params,
@@ -134,11 +97,12 @@
                goto out;
        }
        
-       
-       retp = alloc(rettype);
-       if (!retp) {
-               fail(env);
-               goto out;
+       if (retcls) {
+               retp = alloc(rettype);
+               if (!retp) {
+                       fail(env);
+                       goto out;
+               }
        }
        pp = (void **)malloc(sizeof(void*) * np);
        if (!pp) {
@@ -168,8 +132,9 @@
                goto out;
        }
        
-       ret = Java_org_cinvoke_CInvoke_readValue(env, NULL,
-               (jlong)retp, retcls, rettype);
+       if (retp)
+               ret = Java_org_cinvoke_CInvoke_readValue(env, NULL,
+                       (jlong)retp, retcls, rettype);
 out:
        if (tarr != NULL)
                env->ReleaseIntArrayElements(types, tarr, 0);
@@ -443,24 +408,74 @@
        return cinv_structure_delete(ctx, st);
 }
 
+struct ud {
+       JNIEnv *env;
+       jobject ref;
+       int numparms;
+       jclass *pclasses;
+       int *ptypes;
+       int rettype;
+       bool hasretval;
+};
+
 void cbfunc(CInvFunction *f, void *parameters[],
        void *returnout, void *userdata) {
-/*
-       JNIEnv *env = (JNIEnv *)userdata;
-       // XXX store object in global reference
+       ud *u = (ud *)userdata;
+
+       JNIEnv *env = u->env;
+       jobject val = u->ref;
+       jclass *pclasses = u->pclasses;
+       int *ptypes = u->ptypes;
+       int numparms = u->numparms;
+       int rettype = u->rettype;
+       bool hasretval = u->hasretval;
+
        jclass cls = env->GetObjectClass(val);
        if (!cls) return;
+       jclass objcls = env->FindClass("java/lang/Object");
+       if (!objcls) return;
 
        jmethodID meth = env->GetMethodID(cls, "cbfunc",
-               "([Ljava/lang/Object;)Ljava/lang/Object;");*/
+               "([Ljava/lang/Object;)Ljava/lang/Object;");
+       if (!meth) return;
+
+       jobjectArray parr = env->NewObjectArray(numparms, objcls, NULL);
+       if (!parr) return;
+       for (int i = 0; i < numparms; i++) {
+               env->SetObjectArrayElement(parr, i,
+                       Java_org_cinvoke_CInvoke_readValue(env, NULL, 
(jlong)parameters[i],
+                               pclasses[i], ptypes[i]));
+               if (env->ExceptionOccurred()) return;
+       }
+
+       jobject retval = env->CallObjectMethod(val, meth, parr);
+       if (env->ExceptionOccurred())
+               return;
+
+       if (hasretval)
+               Java_org_cinvoke_CInvoke_writeValue(env, NULL, (jlong)returnout,
+                       retval, rettype);
 }
 
 JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_createCallback(
-       JNIEnv *env, jclass, jlong c, jlong f, jobject cbthunk) {
+       JNIEnv *env, jclass, jlong c, jlong f, jobject cbthunk,
+       jobjectArray pclasses, jintArray ptypes, jboolean hasret, jint rettype) 
{
        CInvContext *ctx = (CInvContext *)c;
        CInvFunction *func = (CInvFunction *)f;
 
-       return (jlong)cinv_callback_create(ctx, func, env, cbfunc);
+       jobject ref = env->NewGlobalRef(cbthunk);
+       if (!ref)
+               return 0;
+
+       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);
+       }
 }
 JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_getEPCallback(
        JNIEnv *env, jclass, jlong c, jlong b) {
@@ -474,5 +489,64 @@
        CInvContext *ctx = (CInvContext *)c;
        CInvCallback *cb = (CInvCallback *)b;
 
+       ud *u = (ud *)cb->userdata;
+       u->env->DeleteGlobalRef(u->ref);
+       for (int i = 0; i < u->numparms; i++)
+               u->env->DeleteGlobalRef(u->pclasses[i]);
+       free(u->pclasses);
+       free(u->ptypes);
+       free(u);
+
        return cinv_callback_delete(ctx, cb);
 }
+
+JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_sizeofBasic(
+       JNIEnv *env, jclass, jint type) {
+       int sz = 0;
+
+       switch (type) {
+       case CINV_T_CHAR:
+               sz = 1;
+               break;
+       case CINV_T_SHORT:
+               sz = sizeof(short);
+               break;
+       case CINV_T_INT:
+               sz = sizeof(int);
+               break;
+       case CINV_T_LONG:
+               sz = sizeof(long);
+               break;
+       case CINV_T_EXTRALONG:
+               sz = sizeof(long long);
+               break;
+       case CINV_T_PTR: 
+               sz = sizeof(void *);
+               break;
+       case CINV_T_FLOAT:
+               sz = sizeof(float);
+               break;
+       case CINV_T_DOUBLE:
+               sz = sizeof(double);
+               break;
+       case T_JSHORT:
+               sz = sizeof(jshort);
+               break;
+       case T_JINT:
+               sz = sizeof(jint);
+               break;
+       case T_JLONG:
+               sz = sizeof(jlong);
+               break;
+       }
+
+       return sz;
+}
+JNIEXPORT jstring JNICALL Java_org_cinvoke_CInvoke_ptrToStringUTF8(
+       JNIEnv *env, jclass, jlong ptr) {
+       return env->NewStringUTF((char *)ptr);
+}
+JNIEXPORT jstring JNICALL Java_org_cinvoke_CInvoke_ptrToStringUnicode(
+       JNIEnv *env, jclass, jlong ptr, jint len) {
+       return env->NewString((jchar *)ptr, len);
+}

Modified: trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.h
===================================================================
--- trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.h   2006-07-03 03:43:37 UTC 
(rev 65)
+++ trunk/cinvoke/bindings/java/org_cinvoke_CInvoke.h   2006-07-03 05:05:33 UTC 
(rev 66)
@@ -24,6 +24,7 @@
 JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_addStructMemberStruct (JNIEnv 
*env, jclass, jlong, jlong, jstring, jlong);
 JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_alloc (JNIEnv *env, jclass, 
jint);
 JNIEXPORT void JNICALL Java_org_cinvoke_CInvoke_free (JNIEnv *env, jclass, 
jlong);
+JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_sizeofBasic (JNIEnv *env, 
jclass, jint);
 JNIEXPORT void JNICALL Java_org_cinvoke_CInvoke_writeValue (JNIEnv *env, 
jclass, jlong, jobject, jint);
 JNIEXPORT jobject JNICALL Java_org_cinvoke_CInvoke_readValue (JNIEnv *env, 
jclass, jlong, jclass, jint);
 JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_setMemberValueStruct (JNIEnv 
*env, jclass, jlong, jlong, jlong, jstring, jobject, jint);
@@ -31,9 +32,17 @@
 JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_finishStruct (JNIEnv *env, 
jclass, jlong, jlong);
 JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_sizeStruct (JNIEnv *env, 
jclass, jlong, jlong);
 JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_deleteStruct (JNIEnv *env, 
jclass, jlong, jlong);
-JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_createCallback (JNIEnv *env, 
jclass, jlong, jlong, jobject);
+JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_createCallback (JNIEnv *env, 
jclass, jlong, jlong, jobject, jobjectArray, jintArray, jboolean, jint);
 JNIEXPORT jlong JNICALL Java_org_cinvoke_CInvoke_getEPCallback (JNIEnv *env, 
jclass, jlong, jlong);
 JNIEXPORT jint JNICALL Java_org_cinvoke_CInvoke_deleteCallback (JNIEnv *env, 
jclass, jlong, jlong);
+JNIEXPORT jstring JNICALL Java_org_cinvoke_CInvoke_ptrToStringUTF8 (JNIEnv 
*env, jclass, jlong);
+JNIEXPORT jstring JNICALL Java_org_cinvoke_CInvoke_ptrToStringUnicode (JNIEnv 
*env, jclass, jlong, jint);
+#undef org_cinvoke_CInvoke_T_JSHORT
+#define org_cinvoke_CInvoke_T_JSHORT -1L
+#undef org_cinvoke_CInvoke_T_JINT
+#define org_cinvoke_CInvoke_T_JINT -2L
+#undef org_cinvoke_CInvoke_T_JLONG
+#define org_cinvoke_CInvoke_T_JLONG -3L
 
 #ifdef __cplusplus
 }





reply via email to

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