[Top][All Lists]
[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
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cinvoke-svn] r66 - in trunk/cinvoke/bindings/java: . org/cinvoke,
will <=