Max 5 API Reference
00001 #include "jit.common.h" 00002 #include "jit.javaob.h" 00003 #include "ext_obex.h" 00004 00005 extern long _cfm_in_ub; 00006 00007 JavaVM *g_jvm=NULL; 00008 #if (JIT_JAVA_USE_CFM) 00009 t_cfm_jni_env *g_jenv=NULL; 00010 t_cfm_invoke_interface *g_jvm_invoke=NULL; 00011 #endif 00012 00013 jfieldID g_jit_java_p_jitobj_fid; 00014 jclass g_jit_java_jitobj_clazz; 00015 jclass g_jit_java_jitmatrix_clazz; 00016 jclass g_atom_clazz; 00017 jclass g_string_clazz; 00018 jclass g_object_clazz; 00019 00020 // Method com.cycling74.max.Atom.newAtom(int) 00021 jmethodID g_newIntAtom_MID; 00022 // Method com.cycling74.max.Atom.newAtom(float) 00023 jmethodID g_newFloatAtom_MID; 00024 // Method com.cycling74.max.Atom.newAtom(String) 00025 jmethodID g_newStringAtom_MID; 00026 // Method com.cycling74.max.Atom.getType 00027 jmethodID g_getAtomType_MID; 00028 // Method com.cycling74.max.IntAtom.getInt 00029 jmethodID g_getIntValue_MID; 00030 // Method com.cycling74.max.FloatAtom.getFloat 00031 jmethodID g_getFloatValue_MID; 00032 // Method com.cycling74.max.StringAtom.getString 00033 jmethodID g_getStringValue_MID; 00034 00035 static t_symbol *ps_bang,*ps_int,*ps_float,*ps_jitter,*ps_registeredname; 00036 static t_symbol *ps_jit_matrix,*ps_jit_matrix_wrapper,*ps_getmatrix,*ps_matrix_calc,*ps_chuck,*ps_append; 00037 static t_symbol *ps_jit_linklist,*ps_class_string,*ps_class_jitter_object,*ps_class_jitter_matrix; 00038 static t_symbol *ps_global_jvm,*ps_global_cfm_env,*ps_global_invoke_interface; 00039 00040 //JNI 00041 jlong JNICALL jit_java_jitobj_new(JNIEnv *env, jobject obj, jstring name, jobjectArray argv); 00042 void JNICALL jit_java_jitobj_free(JNIEnv *env, jobject obj); 00043 00044 jobject JNICALL jit_java_jitobj_send(JNIEnv *env, jobject obj, jstring msg, jobjectArray argv); 00045 jobject JNICALL jit_java_jitobj_send_msg_int(JNIEnv *env, jobject obj, jstring msg, jint val); 00046 jobject JNICALL jit_java_jitobj_send_msg_intarray(JNIEnv *env, jobject obj, jstring msg, jintArray array); 00047 jobject JNICALL jit_java_jitobj_send_msg_float(JNIEnv *env, jobject obj, jstring msg, jfloat val); 00048 jobject JNICALL jit_java_jitobj_send_msg_floatarray(JNIEnv *env, jobject obj, jstring msg, jfloatArray array); 00049 jobject JNICALL jit_java_jitobj_send_msg_string(JNIEnv *env, jobject obj, jstring msg, jstring val); 00050 jobject JNICALL jit_java_jitobj_send_msg_stringarray(JNIEnv *env, jobject obj, jstring msg, jobject array); 00051 00052 jobject JNICALL jit_java_jitobj_bang(JNIEnv *env, jobject obj); 00053 jobject JNICALL jit_java_jitobj_send_int(JNIEnv *env, jobject obj, jint n); 00054 jobject JNICALL jit_java_jitobj_send_float(JNIEnv *env, jobject obj, jfloat f); 00055 jstring JNICALL jit_java_jitobj_get_class(JNIEnv *env, jobject obj); 00056 jboolean JNICALL jit_java_jitobj_understands(JNIEnv *env, jobject obj, jstring msg); 00057 00058 jobject JNICALL jit_java_jitobj_getattr(JNIEnv *env, jobject obj, jstring name); 00059 jint JNICALL jit_java_jitobj_getattr_int(JNIEnv *env, jobject obj, jstring name); 00060 jobject JNICALL jit_java_jitobj_getattr_intarray(JNIEnv *env, jobject obj, jstring name); 00061 jfloat JNICALL jit_java_jitobj_getattr_float(JNIEnv *env, jobject obj, jstring name); 00062 jobject JNICALL jit_java_jitobj_getattr_floatarray(JNIEnv *env, jobject obj, jstring name); 00063 jstring JNICALL jit_java_jitobj_getattr_string(JNIEnv *env, jobject obj, jstring name); 00064 jobject JNICALL jit_java_jitobj_getattr_stringarray(JNIEnv *env, jobject obj, jstring name); 00065 00066 jboolean JNICALL jit_java_jitobj_setattr(JNIEnv *env, jobject obj, jstring name, jobjectArray argv); 00067 jboolean JNICALL jit_java_jitobj_setattr_int(JNIEnv *env, jobject obj, jstring name, jint val); 00068 jboolean JNICALL jit_java_jitobj_setattr_intarray(JNIEnv *env, jobject obj, jstring name, jintArray array); 00069 jboolean JNICALL jit_java_jitobj_setattr_float(JNIEnv *env, jobject obj, jstring name, jfloat val); 00070 jboolean JNICALL jit_java_jitobj_setattr_floatarray(JNIEnv *env, jobject obj, jstring name, jfloatArray array); 00071 jboolean JNICALL jit_java_jitobj_setattr_string(JNIEnv *env, jobject obj, jstring name, jstring val); 00072 jboolean JNICALL jit_java_jitobj_setattr_stringarray(JNIEnv *env, jobject obj, jstring name, jobject array); 00073 00074 jstring JNICALL jit_java_jitobj_getregisteredname(JNIEnv *env, jobject obj); 00075 00076 t_object *get_jit_java_jitobj(JNIEnv *env, jobject obj); 00077 jobject JNICALL jit_java_jitobj_returnvalue(JNIEnv *env, t_atom a); 00078 void jit_java_jitobj_register_natives(JNIEnv *env, jclass clazz); 00079 00080 //internal 00081 void jit_java_jitter_register_natives(JNIEnv*, jclass); 00082 00083 t_object *get_jit_java_jitobj(JNIEnv *env, jobject obj) 00084 { 00085 return (t_object *)(JIT_JAVA_JNI_CALL(env,GetLongField)(env, obj,g_jit_java_p_jitobj_fid)); 00086 } 00087 00088 jlong JNICALL jit_java_jitobj_new(JNIEnv *env, jobject obj, jstring name, jobjectArray argv) 00089 { 00090 char *s; 00091 short ac; 00092 t_atom *av; 00093 t_max_err res; 00094 t_object *o; 00095 t_symbol *classname; 00096 char tmp[256]; 00097 long i,len; 00098 t_class *c; 00099 t_object *p=NULL; 00100 t_symbol *tmpsym; 00101 00102 if(!name) 00103 return 0; //NULL pointer 00104 00105 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00106 classname = gensym(s); 00107 strcpy(tmp,s); 00108 len = strlen(tmp); 00109 for (i=0;i<len;i++) { 00110 //replace periods with underscores 00111 if (tmp[i]=='.') 00112 tmp[i] = '_'; 00113 } 00114 00115 // match on jit.matrix/jit_matrix and use jit_matrix_wrapper class 00116 // rather than raw jit_matrix class 00117 tmpsym = gensym(tmp); 00118 if (tmpsym==ps_jit_matrix) { 00119 tmpsym = ps_jit_matrix_wrapper; 00120 strcpy(tmp,tmpsym->s_name); 00121 } 00122 00123 // lookup class 00124 c = class_findbyname(ps_jitter,tmpsym); 00125 if (!c) { 00126 // if not found, attempt to instantiate max object, loading from disk 00127 //jit_object_post((t_object *)x,"jit_java_jit_obj_new: could not find %s. calling newinstance()",tmp); 00128 if (p=newinstance(classname,0,NULL)) { 00129 c = class_findbyname(ps_jitter,tmpsym); 00130 freeobject(p); 00131 p = NULL; 00132 } 00133 //else 00134 // return 0; 00135 } 00136 00137 if (argv != NULL) 00138 { 00139 av = jit_java_newargv(env,argv,&ac); 00140 o = object_new_typed(ps_jitter,tmpsym,ac,av); 00141 if (av) 00142 jit_freebytes(av,ac * sizeof(t_atom)); 00143 } 00144 else 00145 o = object_new_typed(ps_jitter,tmpsym,0,NULL); 00146 if (o) 00147 { 00148 if (!jit_java_regob_lookup(o)) { 00149 if (jit_java_regob_register(o,jit_symbol_unique())) 00150 error("jit_java_jitobj_new: error trying to register object"); 00151 } 00152 } 00153 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00154 JIT_JAVA_JNI_CALL(env,DeleteLocalRef)(env,name); 00155 return (jlong)o; 00156 } 00157 00158 t_symbol *jit_java_regob_lookup(t_jit_object *x) 00159 { 00160 t_symbol *regsym=NULL; 00161 00162 if (x) { 00163 regsym=jit_attr_getsym(x,ps_registeredname); 00164 if ((!regsym)||(regsym==_jit_sym_nothing)) 00165 regsym=jit_object_findregisteredbyptr(x); 00166 if (regsym==_jit_sym_nothing) 00167 regsym = NULL; 00168 } 00169 return regsym; 00170 } 00171 00172 t_jit_err jit_java_regob_register(t_jit_object *x, t_symbol *regname) 00173 { 00174 if (jit_object_findregistered(regname)||jit_object_findregisteredbyptr(x)) 00175 return JIT_ERR_GENERIC; 00176 00177 if (jit_object_attr_get(x,ps_registeredname)) 00178 jit_attr_setsym(x,ps_registeredname,regname); 00179 else 00180 jit_object_register(x,regname); 00181 00182 return JIT_ERR_NONE; 00183 } 00184 00185 void JNICALL jit_java_jitobj_free(JNIEnv *env, jobject obj) 00186 { 00187 long zero = 0; 00188 t_object *o = get_jit_java_jitobj(env,obj); 00189 if (o) 00190 freeobject(o); 00191 00192 JIT_JAVA_JNI_CALL(env,SetLongField)(env,obj,g_jit_java_p_jitobj_fid,zero); 00193 } 00194 00195 jobject JNICALL jit_java_jitobj_bang(JNIEnv *env, jobject obj) 00196 { 00197 t_object *o = get_jit_java_jitobj(env,obj); 00198 t_atom arv; 00199 00200 arv.a_type = A_NOTHING; 00201 if(o) 00202 { 00203 object_method_typed(o,ps_bang,0,NULL,&arv); 00204 } 00205 return jit_java_jitobj_returnvalue(env,arv); 00206 } 00207 00208 jobject JNICALL jit_java_jitobj_send_int(JNIEnv *env, jobject obj, jint n) 00209 { 00210 t_object *o = get_jit_java_jitobj(env,obj); 00211 t_atom a; 00212 t_atom arv; 00213 00214 arv.a_type = A_NOTHING; 00215 if(o) 00216 { 00217 atom_setlong(&a,n); 00218 object_method_typed(o,ps_int,1,&a,&arv); 00219 } 00220 return jit_java_jitobj_returnvalue(env,arv); 00221 } 00222 00223 jobject JNICALL jit_java_jitobj_send_float(JNIEnv *env, jobject obj,jfloat f) 00224 { 00225 t_object *o = get_jit_java_jitobj(env,obj); 00226 t_atom a; 00227 t_atom arv; 00228 00229 arv.a_type = A_NOTHING; 00230 if(o) 00231 { 00232 atom_setfloat(&a,f); 00233 object_method_typed(o,ps_float,1,&a,&arv); 00234 } 00235 return jit_java_jitobj_returnvalue(env,arv); 00236 } 00237 00238 jobject JNICALL jit_java_jitobj_send(JNIEnv *env, jobject obj, jstring msg, jobjectArray argv) 00239 { 00240 char *s; 00241 short ac; 00242 t_atom *av; 00243 t_atom arv; 00244 t_max_err res; 00245 t_object *o; 00246 00247 if(!msg) 00248 return NULL; 00249 00250 o = get_jit_java_jitobj(env,obj); 00251 if(!o) 00252 return NULL; 00253 00254 arv.a_type = A_NOTHING; 00255 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00256 00257 if(argv != NULL) 00258 { 00259 av = jit_java_newargv(env,argv, &ac); 00260 res = object_method_typed(o,gensym(s),ac,av,&arv); 00261 if (av) 00262 jit_freebytes(av,ac * sizeof(t_atom)); 00263 } 00264 else 00265 res = object_method_typed(o,gensym(s),0,NULL,&arv); 00266 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00267 00268 return jit_java_jitobj_returnvalue(env,arv); 00269 } 00270 00271 jobject JNICALL jit_java_jitobj_send_msg_int(JNIEnv *env, jobject obj, jstring msg, jint val) 00272 { 00273 char *s; 00274 t_atom a; 00275 t_atom arv; 00276 t_max_err res; 00277 t_object *o; 00278 00279 if(!msg) 00280 return NULL; 00281 00282 o = get_jit_java_jitobj(env,obj); 00283 if(!o) 00284 return NULL; 00285 00286 arv.a_type = A_NOTHING; 00287 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00288 00289 atom_setlong(&a,val); 00290 res = object_method_typed(o,gensym(s),1,&a,&arv); 00291 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00292 00293 return jit_java_jitobj_returnvalue(env,arv); 00294 } 00295 00296 jobject JNICALL jit_java_jitobj_send_msg_intarray(JNIEnv *env, jobject obj, jstring msg, jintArray array) 00297 { 00298 char *s; 00299 long i,ac=0; 00300 t_atom *av=NULL; 00301 t_atom arv; 00302 t_max_err res; 00303 t_object *o; 00304 jint *elements; 00305 jboolean is_copy; 00306 00307 if(!msg) 00308 return JNI_FALSE; 00309 00310 o = get_jit_java_jitobj(env,obj); 00311 if(!o)//would be weird 00312 return JNI_FALSE; 00313 00314 arv.a_type = A_NOTHING; 00315 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00316 00317 if (array) { 00318 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 00319 av = (t_atom *)jit_getbytes(ac*sizeof(t_atom)); 00320 00321 elements = JIT_JAVA_JNI_CALL(env, GetIntArrayElements)(env,(jintArray)array,&is_copy); 00322 checkException(env); 00323 00324 for(i=0;i<ac;i++) 00325 atom_setlong(av+i,elements[i]); 00326 if (is_copy) 00327 { 00328 JIT_JAVA_JNI_CALL(env, ReleaseIntArrayElements)(env,(jintArray)array,elements,0); 00329 checkException(env); 00330 } 00331 00332 } 00333 00334 res = object_method_typed(o,gensym(s),ac,av,&arv); 00335 if (av) 00336 jit_freebytes(av,ac*sizeof(t_atom)); 00337 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00338 00339 return jit_java_jitobj_returnvalue(env,arv); 00340 } 00341 00342 jobject JNICALL jit_java_jitobj_send_msg_float(JNIEnv *env, jobject obj, jstring msg, jfloat val) 00343 { 00344 char *s; 00345 t_atom a; 00346 t_atom arv; 00347 t_max_err res; 00348 t_object *o; 00349 00350 if(!msg) 00351 return NULL; 00352 00353 o = get_jit_java_jitobj(env,obj); 00354 if(!o) 00355 return NULL; 00356 00357 arv.a_type = A_NOTHING; 00358 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00359 00360 atom_setfloat(&a,val); 00361 res = object_method_typed(o,gensym(s),1,&a,&arv); 00362 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00363 00364 return jit_java_jitobj_returnvalue(env,arv); 00365 } 00366 00367 jobject JNICALL jit_java_jitobj_send_msg_floatarray(JNIEnv *env, jobject obj, jstring msg, jfloatArray array) 00368 { 00369 char *s; 00370 long i,ac=0; 00371 t_atom *av=NULL; 00372 t_atom arv; 00373 t_max_err res; 00374 t_object *o; 00375 jfloat *elements; 00376 jboolean is_copy; 00377 00378 if(!msg) 00379 return JNI_FALSE; 00380 00381 o = get_jit_java_jitobj(env,obj); 00382 if(!o)//would be weird 00383 return JNI_FALSE; 00384 00385 arv.a_type = A_NOTHING; 00386 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00387 00388 if (array) { 00389 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 00390 av = (t_atom *)jit_getbytes(ac*sizeof(t_atom)); 00391 00392 elements = JIT_JAVA_JNI_CALL(env, GetFloatArrayElements)(env,(jfloatArray)array,&is_copy); 00393 checkException(env); 00394 00395 for(i=0;i<ac;i++) 00396 atom_setfloat(av+i,elements[i]); 00397 if (is_copy) 00398 { 00399 JIT_JAVA_JNI_CALL(env, ReleaseFloatArrayElements)(env,(jfloatArray)array,elements,0); 00400 checkException(env); 00401 } 00402 00403 } 00404 00405 res = object_method_typed(o,gensym(s),ac,av,&arv); 00406 if (av) 00407 jit_freebytes(av,ac*sizeof(t_atom)); 00408 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00409 00410 return jit_java_jitobj_returnvalue(env,arv); 00411 } 00412 00413 jobject JNICALL jit_java_jitobj_send_msg_string(JNIEnv *env, jobject obj, jstring msg, jstring val) 00414 { 00415 char *s,*s2; 00416 t_atom a; 00417 t_atom arv; 00418 t_max_err res; 00419 t_object *o; 00420 00421 if(!msg) 00422 return NULL; 00423 00424 o = get_jit_java_jitobj(env,obj); 00425 if(!o) 00426 return NULL; 00427 00428 arv.a_type = A_NOTHING; 00429 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00430 s2 = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,val,NULL); 00431 00432 atom_setsym(&a,gensym(s2)); 00433 res = object_method_typed(o,gensym(s),1,&a,&arv); 00434 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00435 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,val,s2); 00436 00437 return jit_java_jitobj_returnvalue(env,arv); 00438 } 00439 00440 jobject JNICALL jit_java_jitobj_send_msg_stringarray(JNIEnv *env, jobject obj, jstring msg, jobject array) 00441 { 00442 char *s,*s2; 00443 long i,ac=0; 00444 t_atom *av=NULL; 00445 t_atom arv; 00446 t_max_err res; 00447 t_object *o; 00448 jstring js; 00449 00450 if(!msg) 00451 return JNI_FALSE; 00452 00453 o = get_jit_java_jitobj(env,obj); 00454 if(!o)//would be weird 00455 return JNI_FALSE; 00456 00457 arv.a_type = A_NOTHING; 00458 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 00459 00460 if (array) { 00461 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 00462 av = (t_atom *)jit_getbytes(ac*sizeof(t_atom)); 00463 00464 for(i=0;i<ac;i++) { 00465 js = JIT_JAVA_JNI_CALL(env,GetObjectArrayElement)(env,array,i); 00466 checkException(env); 00467 s2 = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,js,NULL); 00468 00469 atom_setsym(av+i,gensym(s2)); 00470 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,js,s2); 00471 } 00472 } 00473 00474 res = object_method_typed(o,gensym(s),ac,av,&arv); 00475 if (av) 00476 jit_freebytes(av,ac*sizeof(t_atom)); 00477 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 00478 00479 return jit_java_jitobj_returnvalue(env,arv); 00480 } 00481 00482 jobject JNICALL jit_java_jitobj_getattr(JNIEnv *env, jobject obj, jstring name) 00483 { 00484 char *s; 00485 long ac=0; 00486 t_atom *av=NULL; 00487 t_max_err res; 00488 t_object *o; 00489 jobject jrv=NULL; 00490 00491 if(!name) 00492 return NULL; 00493 00494 o = get_jit_java_jitobj(env,obj); 00495 if(!o) 00496 return NULL; 00497 00498 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00499 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00500 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00501 00502 if (ac&&av) { 00503 jrv=jit_java_newatomarray(env,ac,av); 00504 freebytes(av,ac*sizeof(t_atom)); 00505 } 00506 return jrv; 00507 } 00508 00509 jint JNICALL jit_java_jitobj_getattr_int(JNIEnv *env, jobject obj, jstring name) 00510 { 00511 char *s; 00512 long ac=0; 00513 t_atom *av=NULL; 00514 t_max_err res; 00515 t_object *o; 00516 jint jrv=0; 00517 00518 if(!name) 00519 return 0; 00520 00521 o = get_jit_java_jitobj(env,obj); 00522 if(!o) 00523 return 0; 00524 00525 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00526 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00527 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00528 00529 if (ac&&av) { 00530 jrv=(jint)atom_getlong(av); 00531 freebytes(av,ac*sizeof(t_atom)); 00532 } 00533 return jrv; 00534 } 00535 00536 jintArray JNICALL jit_java_jitobj_getattr_intarray(JNIEnv *env, jobject obj, jstring name) 00537 { 00538 char *s; 00539 long i,ac=0; 00540 t_atom *av=NULL; 00541 t_max_err res; 00542 t_object *o; 00543 jint *vp; 00544 jintArray ja=0; 00545 00546 if(!name) 00547 return NULL; 00548 00549 o = get_jit_java_jitobj(env,obj); 00550 if(!o) 00551 return NULL; 00552 00553 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00554 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00555 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00556 00557 ja = jit_java_newintarray(env,ac,av); 00558 if (ac&&av) { 00559 freebytes(av,ac*sizeof(t_atom)); 00560 } 00561 return ja; 00562 } 00563 00564 00565 00566 jfloat JNICALL jit_java_jitobj_getattr_float(JNIEnv *env, jobject obj, jstring name) 00567 { 00568 char *s; 00569 long ac=0; 00570 t_atom *av=NULL; 00571 t_max_err res; 00572 t_object *o; 00573 jfloat jrv=0.; 00574 00575 if(!name) 00576 return (jfloat)0; 00577 00578 o = get_jit_java_jitobj(env,obj); 00579 if(!o) 00580 return (jfloat)0; 00581 00582 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00583 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00584 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00585 00586 if (ac&&av) { 00587 jrv=(jfloat)atom_getfloat(av); 00588 freebytes(av,ac*sizeof(t_atom)); 00589 } 00590 return jrv; 00591 } 00592 00593 jobject JNICALL jit_java_jitobj_getattr_floatarray(JNIEnv *env, jobject obj, jstring name) 00594 { 00595 char *s; 00596 long i,ac=0; 00597 t_atom *av=NULL; 00598 t_max_err res; 00599 t_object *o; 00600 jfloat *vp; 00601 jfloatArray ja=0; 00602 00603 if(!name) 00604 return NULL; 00605 00606 o = get_jit_java_jitobj(env,obj); 00607 if(!o) 00608 return NULL; 00609 00610 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00611 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00612 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00613 00614 ja = jit_java_newfloatarray(env,ac,av); 00615 if (ac&&av) { 00616 freebytes(av,ac*sizeof(t_atom)); 00617 } 00618 return ja; 00619 } 00620 00621 jstring JNICALL jit_java_jitobj_getattr_string(JNIEnv *env, jobject obj, jstring name) 00622 { 00623 char *s; 00624 long ac=0; 00625 t_atom *av=NULL; 00626 t_max_err res; 00627 t_object *o; 00628 jstring jrv=NULL; 00629 00630 if(!name) 00631 return NULL; 00632 00633 o = get_jit_java_jitobj(env,obj); 00634 if(!o) 00635 return NULL; 00636 00637 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00638 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00639 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00640 00641 if (ac&&av) { 00642 jrv = JIT_JAVA_JNI_CALL(env,NewStringUTF)(env,atom_getsym(av)->s_name); 00643 freebytes(av,ac*sizeof(t_atom)); 00644 } 00645 00646 return jrv; 00647 } 00648 00649 jobject JNICALL jit_java_jitobj_getattr_stringarray(JNIEnv *env, jobject obj, jstring name) 00650 { 00651 char *s; 00652 long i,ac=0; 00653 t_atom *av=NULL; 00654 t_max_err res; 00655 t_object *o; 00656 jstring js; 00657 jfloatArray ja=0; 00658 00659 if(!name) 00660 return NULL; 00661 00662 o = get_jit_java_jitobj(env,obj); 00663 if(!o) 00664 return NULL; 00665 00666 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00667 res = object_attr_getvalueof(o,gensym(s),&ac,&av); 00668 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00669 00670 if (ac&&av) { 00671 ja = (jarray)JIT_JAVA_JNI_CALL(env,NewObjectArray)(env,ac,g_string_clazz,NULL); 00672 checkException(env); 00673 00674 for(i=0;i<ac;i++) 00675 { 00676 js = JIT_JAVA_JNI_CALL(env,NewStringUTF)(env,atom_getsym(av+i)->s_name); 00677 JIT_JAVA_JNI_CALL(env,SetObjectArrayElement)(env,ja,i,js); 00678 } 00679 checkException(env); 00680 freebytes(av,ac*sizeof(t_atom)); 00681 } 00682 return ja; 00683 } 00684 00685 jboolean JNICALL jit_java_jitobj_setattr(JNIEnv *env, jobject obj, jstring name, jobjectArray argv) 00686 { 00687 char *s; 00688 short ac; 00689 t_atom *av; 00690 t_max_err res; 00691 t_object *o; 00692 00693 if(!name) 00694 return JNI_FALSE; 00695 00696 o = get_jit_java_jitobj(env,obj); 00697 if(!o)//would be weird 00698 return JNI_FALSE; 00699 00700 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00701 00702 if(argv != NULL) 00703 { 00704 av = jit_java_newargv(env,argv,&ac); 00705 res = object_attr_setvalueof(o,gensym(s),ac,av); 00706 jit_freebytes(av,ac * sizeof(t_atom)); 00707 } 00708 else 00709 res = object_attr_setvalueof(o,gensym(s),0,NULL); 00710 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00711 00712 return (!res); 00713 } 00714 00715 jboolean JNICALL jit_java_jitobj_setattr_int(JNIEnv *env, jobject obj, jstring name, jint val) 00716 { 00717 char *s; 00718 t_atom a; 00719 t_max_err res; 00720 t_object *o; 00721 jboolean is_copy; 00722 00723 if(!name) 00724 return JNI_FALSE; 00725 00726 o = get_jit_java_jitobj(env,obj); 00727 if(!o)//would be weird 00728 return JNI_FALSE; 00729 00730 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00731 00732 atom_setlong(&a,val); 00733 res = object_attr_setvalueof(o,gensym(s),1,&a); 00734 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00735 00736 return (!res); 00737 } 00738 00739 00740 jboolean JNICALL jit_java_jitobj_setattr_intarray(JNIEnv *env, jobject obj, jstring name, jintArray array) 00741 { 00742 char *s; 00743 long i,ac=0; 00744 t_atom *av=NULL; 00745 t_max_err res; 00746 t_object *o; 00747 jint *elements; 00748 jboolean is_copy; 00749 00750 if(!name) 00751 return JNI_FALSE; 00752 00753 o = get_jit_java_jitobj(env,obj); 00754 if(!o)//would be weird 00755 return JNI_FALSE; 00756 00757 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00758 00759 if (array) { 00760 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 00761 av = (t_atom *)jit_getbytes(ac*sizeof(t_atom)); 00762 00763 elements = JIT_JAVA_JNI_CALL(env, GetIntArrayElements)(env,(jintArray)array,&is_copy); 00764 checkException(env); 00765 00766 for(i=0;i<ac;i++) 00767 atom_setlong(av+i,elements[i]); 00768 if (is_copy) 00769 { 00770 JIT_JAVA_JNI_CALL(env, ReleaseIntArrayElements)(env,(jintArray)array,elements,0); 00771 checkException(env); 00772 } 00773 00774 } 00775 00776 res = object_attr_setvalueof(o,gensym(s),ac,av); 00777 if (av) 00778 jit_freebytes(av,ac*sizeof(t_atom)); 00779 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00780 00781 return (!res); 00782 } 00783 00784 00785 jboolean JNICALL jit_java_jitobj_setattr_float(JNIEnv *env, jobject obj, jstring name, jfloat val) 00786 { 00787 char *s; 00788 t_atom a; 00789 t_max_err res; 00790 t_object *o; 00791 00792 if(!name) 00793 return JNI_FALSE; 00794 00795 o = get_jit_java_jitobj(env,obj); 00796 if(!o)//would be weird 00797 return JNI_FALSE; 00798 00799 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00800 00801 atom_setfloat(&a,val); 00802 res = object_attr_setvalueof(o,gensym(s),1,&a); 00803 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00804 00805 return (!res); 00806 } 00807 00808 jboolean JNICALL jit_java_jitobj_setattr_floatarray(JNIEnv *env, jobject obj, jstring name, jfloatArray array) 00809 { 00810 char *s; 00811 long i,ac=0; 00812 t_atom *av=NULL; 00813 t_max_err res; 00814 t_object *o; 00815 jfloat *elements; 00816 jboolean is_copy; 00817 00818 if(!name) 00819 return JNI_FALSE; 00820 00821 o = get_jit_java_jitobj(env,obj); 00822 if(!o)//would be weird 00823 return JNI_FALSE; 00824 00825 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00826 00827 if (array) { 00828 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 00829 av = (t_atom *)jit_getbytes(ac*sizeof(t_atom)); 00830 00831 elements = JIT_JAVA_JNI_CALL(env, GetFloatArrayElements)(env,(jfloatArray)array,&is_copy); 00832 checkException(env); 00833 00834 for(i=0;i<ac;i++) 00835 atom_setfloat(av+i,elements[i]); 00836 if (is_copy) 00837 { 00838 JIT_JAVA_JNI_CALL(env, ReleaseFloatArrayElements)(env,(jfloatArray)array,elements,0); 00839 checkException(env); 00840 } 00841 00842 } 00843 00844 res = object_attr_setvalueof(o,gensym(s),ac,av); 00845 if (av) 00846 jit_freebytes(av,ac*sizeof(t_atom)); 00847 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00848 00849 return (!res); 00850 } 00851 00852 00853 jboolean JNICALL jit_java_jitobj_setattr_string(JNIEnv *env, jobject obj, jstring name, jstring val) 00854 { 00855 char *s,*s2; 00856 t_atom a; 00857 t_max_err res; 00858 t_object *o; 00859 00860 if(!name) 00861 return JNI_FALSE; 00862 00863 o = get_jit_java_jitobj(env,obj); 00864 if(!o)//would be weird 00865 return JNI_FALSE; 00866 00867 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00868 s2 = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,val,NULL); 00869 00870 atom_setsym(&a,gensym(s2)); 00871 res = object_attr_setvalueof(o,gensym(s),1,&a); 00872 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00873 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,val,s2); 00874 00875 return (!res); 00876 } 00877 00878 jboolean JNICALL jit_java_jitobj_setattr_stringarray(JNIEnv *env, jobject obj, jstring name, jobject array) 00879 { 00880 char *s,*s2; 00881 long i,ac=0; 00882 t_atom *av=NULL; 00883 t_max_err res; 00884 t_object *o; 00885 jstring js; 00886 00887 if(!name) 00888 return JNI_FALSE; 00889 00890 o = get_jit_java_jitobj(env,obj); 00891 if(!o)//would be weird 00892 return JNI_FALSE; 00893 00894 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,name,NULL); 00895 00896 if (array) { 00897 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 00898 av = (t_atom *)jit_getbytes(ac*sizeof(t_atom)); 00899 00900 for(i=0;i<ac;i++) { 00901 js = JIT_JAVA_JNI_CALL(env,GetObjectArrayElement)(env,array,i); 00902 checkException(env); 00903 s2 = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,js,NULL); 00904 00905 atom_setsym(av+i,gensym(s2)); 00906 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,js,s2); 00907 } 00908 } 00909 res = object_attr_setvalueof(o,gensym(s),ac,av); 00910 if (av) 00911 jit_freebytes(av,ac*sizeof(t_atom)); 00912 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,name,s); 00913 00914 return (!res); 00915 } 00916 00917 jstring JNICALL jit_java_jitobj_getregisteredname(JNIEnv *env, jobject obj) 00918 { 00919 t_symbol *s; 00920 t_max_err res; 00921 t_object *o; 00922 jstring jrv=NULL; 00923 00924 o = get_jit_java_jitobj(env,obj); 00925 if(!o) 00926 return NULL; 00927 00928 if (s=jit_java_regob_lookup(o)) { 00929 jrv = JIT_JAVA_JNI_CALL(env,NewStringUTF)(env,s->s_name); 00930 } 00931 return jrv; 00932 } 00933 00934 long jobject_getclassname(JNIEnv *env, jobject obj, char *classname); 00935 long jobject_getclassname(JNIEnv *env, jobject obj, char *classname) 00936 { 00937 jclass theclass; 00938 jstring jclassname; 00939 char *tmp; 00940 static jmethodID getName_MID=NULL; 00941 00942 classname[0] = '\0'; 00943 00944 if(!obj) 00945 return -1; 00946 00947 theclass = JIT_JAVA_JNI_CALL(env,GetObjectClass)(env,obj); 00948 checkException(env); 00949 if (!getName_MID) { 00950 jclass classclass; 00951 classclass = JIT_JAVA_JNI_CALL(env,FindClass)(env,"java/lang/Class"); 00952 checkException(env); 00953 getName_MID = JIT_JAVA_JNI_CALL(env,GetMethodID)(env,classclass,"getName","()Ljava/lang/String;"); 00954 checkException(env); 00955 if (!getName_MID) 00956 return -1; 00957 } 00958 jclassname = JIT_JAVA_JNI_CALL(env,CallObjectMethod)(env,theclass,getName_MID); 00959 checkException(env); 00960 tmp = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,jclassname,NULL); 00961 strcpy(classname,tmp); 00962 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,jclassname,tmp); 00963 return 0; 00964 } 00965 00966 t_object *jit_matrix_from_jobject_with_classname(JNIEnv *env, jobject obj, char *classname); 00967 t_object *jit_matrix_from_jobject_with_classname(JNIEnv *env, jobject obj, char *classname) 00968 { 00969 char *s; 00970 t_symbol *class_sym=gensym(classname); 00971 t_object *rv=NULL; 00972 00973 if (class_sym==ps_class_string) { 00974 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,obj,NULL); 00975 rv = object_findregistered(ps_jitter,gensym(s)); 00976 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,obj,s); 00977 } else if ((class_sym==ps_class_jitter_matrix)||(class_sym==ps_class_jitter_object)) { 00978 rv = object_method(get_jit_java_jitobj(env,obj),ps_getmatrix); // jit_matrix_wrapper class 00979 // eventually need to add check for JitterMatrix class 00980 } else { 00981 error("mxj: JitterObject.matrixcalc() argument is not String, or JitterMatrix: %s", class_sym->s_name); 00982 } 00983 00984 return rv; 00985 } 00986 00987 t_object *jit_matrix_from_jobject(JNIEnv *env, jobject obj); 00988 t_object *jit_matrix_from_jobject(JNIEnv *env, jobject obj) 00989 { 00990 char classname[256]; 00991 t_object *rv=NULL; 00992 00993 jobject_getclassname(env,obj,classname); 00994 return jit_matrix_from_jobject_with_classname(env,obj,classname); 00995 00996 /* 00997 the following attempt to optimize based on class pointer, seems somehow flawed 00998 could revisit if we deem the current classname approach flawed or inefficient 00999 01000 static jclass stringclass=NULL; 01001 static jclass jitterobjectclass=NULL; 01002 static jclass jittermatrixclass=NULL; //not yet 01003 jclass theclass; 01004 char *s; 01005 t_object *rv=NULL; 01006 01007 this doesn't seem to work 01008 if (!stringclass) { 01009 stringclass = JIT_JAVA_JNI_CALL(env,FindClass)(env,"java/lang/String"); 01010 jitterobjectclass = JIT_JAVA_JNI_CALL(env,FindClass)(env,"com/cycling74/jitter/JitterObject"); 01011 //jittermatrixclass = JIT_JAVA_JNI_CALL(env,FindClass)(env,"com/cycling74/jitter/JitterMatrix"); 01012 checkException(env); 01013 jit_object_post((t_object *)x,"stringclass %x",(long)stringclass); 01014 jit_object_post((t_object *)x,"jitterobjectclass %x",(long)jitterobjectclass); 01015 } 01016 theclass = JIT_JAVA_JNI_CALL(env,GetObjectClass)(env,obj); 01017 checkException(env); 01018 if (theclass==stringclass) { 01019 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,obj,NULL); 01020 rv = object_findregistered(ps_jitter,gensym(s)); 01021 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,obj,s); 01022 } else if (theclass==jitterobjectclass) { 01023 rv = object_method(get_jit_java_jitobj(env,obj),ps_getmatrix); // jit_matrix_wrapper class 01024 } else { 01025 error("mxj: JitterObject.matrixcalc() argument is not String, or JitterMatrix"); 01026 jit_object_post((t_object *)x,"theclass %x",(long)theclass); 01027 } 01028 return rv; 01029 */ 01030 } 01031 01032 01033 t_object *matrixcalc_build_io_list(JNIEnv *env, jobject obj); 01034 t_object *matrixcalc_build_io_list(JNIEnv *env, jobject obj) 01035 { 01036 char classname[256]; 01037 long i,len,isarray; 01038 jobject jo; 01039 t_object *matrix; 01040 t_object *list; 01041 01042 list = object_new(ps_jitter,ps_jit_linklist); 01043 01044 if (obj) { 01045 jobject_getclassname(env,obj,classname); 01046 isarray = (classname[0]=='['); 01047 if (isarray) { 01048 // make sure it is an object array, not a primitive array 01049 // to protect GetObjectArrayElement call (hack) 01050 if (classname[4]) { 01051 len = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,obj); 01052 //jit_object_post((t_object *)x,"building array of size %d",len); 01053 for (i=0;i<len;i++) { 01054 jo = JIT_JAVA_JNI_CALL(env,GetObjectArrayElement)(env,obj,i); 01055 matrix = jit_matrix_from_jobject(env,jo); 01056 if (matrix) 01057 object_method(list,ps_append,matrix); 01058 //jit_object_post((t_object *)x,"iolist(multi): appending %x", matrix); 01059 } 01060 } 01061 } else { 01062 matrix = jit_matrix_from_jobject_with_classname(env,obj,classname); 01063 if (matrix) 01064 object_method(list,ps_append,matrix); 01065 //jit_object_post((t_object *)x,"iolist(single): appending %x", matrix); 01066 } 01067 } 01068 01069 return list; 01070 } 01071 01072 jboolean JNICALL jit_java_jitobj_matrixcalc(JNIEnv *env, jobject obj, jobject in_obj, jobject out_obj); 01073 jboolean JNICALL jit_java_jitobj_matrixcalc(JNIEnv *env, jobject obj, jobject in_obj, jobject out_obj) 01074 { 01075 t_max_err err; 01076 t_object *o; 01077 t_object *input; 01078 t_object *output; 01079 01080 o = get_jit_java_jitobj(env,obj); 01081 if(!o) 01082 return 0; 01083 01084 // should return false if object doesn't have a ps_matrix_calc method 01085 01086 input = matrixcalc_build_io_list(env,in_obj); 01087 output = matrixcalc_build_io_list(env,out_obj); 01088 01089 err = (t_max_err) object_method(o,ps_matrix_calc,input,output); 01090 if (err) { 01091 // could resolve error number to error string. and could return error in rval 01092 error("%d calling matrixcalc on %s",err,object_classname(o)->s_name); 01093 } 01094 01095 if (input) { 01096 object_method(input,ps_chuck); 01097 } 01098 if (output) { 01099 object_method(output,ps_chuck); 01100 } 01101 01102 return (!err); 01103 } 01104 01105 01106 jobject JNICALL jit_java_jitobj_returnvalue(JNIEnv *env, t_atom a) 01107 { 01108 jobject jrv=NULL; 01109 01110 if (a.a_type==A_NOTHING) { 01111 jrv = NULL; 01112 } else if (a.a_type==A_OBJ) { 01113 long ac = 0; 01114 t_atom *av=NULL; 01115 t_object *o = (t_object *)a.a_w.w_obj; 01116 01117 if (o) { 01118 object_getvalueof(o,&ac,&av); 01119 if (ac) 01120 jrv = jit_java_newatomarray(env, ac, av); 01121 else 01122 jrv = NULL; 01123 freeobject(o); 01124 if (ac&&av) 01125 freebytes((char *)av,ac*sizeof(t_atom)); 01126 } else { 01127 jrv = NULL; 01128 } 01129 } else { 01130 jrv = jit_java_newatomarray(env, 1, &a); 01131 } 01132 01133 return jrv; 01134 } 01135 01136 jobject JNICALL jit_java_jitobj_returnvalue_intarray(JNIEnv *env, t_atom a) 01137 { 01138 jobject jrv=NULL; 01139 01140 if (a.a_type==A_NOTHING) { 01141 jrv = NULL; 01142 } else if (a.a_type==A_OBJ) { 01143 long ac = 0; 01144 t_atom *av=NULL; 01145 t_object *o = (t_object *)a.a_w.w_obj; 01146 01147 if (o) { 01148 object_getvalueof(o,&ac,&av); 01149 if (ac) 01150 jrv = jit_java_newintarray(env, ac, av); 01151 else 01152 jrv = NULL; 01153 freeobject(o); 01154 freebytes((char *)av,ac*sizeof(t_atom)); 01155 } else { 01156 jrv = NULL; 01157 } 01158 } else { 01159 jrv = jit_java_newintarray(env, 1, &a); 01160 } 01161 01162 return jrv; 01163 } 01164 01165 jobject JNICALL jit_java_jitobj_returnvalue_floatarray(JNIEnv *env, t_atom a) 01166 { 01167 jobject jrv=NULL; 01168 01169 if (a.a_type==A_NOTHING) { 01170 jrv = NULL; 01171 } else if (a.a_type==A_OBJ) { 01172 long ac = 0; 01173 t_atom *av=NULL; 01174 t_object *o = (t_object *)a.a_w.w_obj; 01175 01176 if (o) { 01177 object_getvalueof(o,&ac,&av); 01178 if (ac) 01179 jrv = jit_java_newfloatarray(env, ac, av); 01180 else 01181 jrv = NULL; 01182 freeobject(o); 01183 freebytes((char *)av,ac*sizeof(t_atom)); 01184 } else { 01185 jrv = NULL; 01186 } 01187 } else { 01188 jrv = jit_java_newfloatarray(env, 1, &a); 01189 } 01190 01191 return jrv; 01192 } 01193 01194 jobject JNICALL jit_java_jitobj_returnvalue_doublearray(JNIEnv *env, t_atom a) 01195 { 01196 jobject jrv=NULL; 01197 01198 if (a.a_type==A_NOTHING) { 01199 jrv = NULL; 01200 } else if (a.a_type==A_OBJ) { 01201 long ac = 0; 01202 t_atom *av=NULL; 01203 t_object *o = (t_object *)a.a_w.w_obj; 01204 01205 if (o) { 01206 object_getvalueof(o,&ac,&av); 01207 if (ac) 01208 jrv = jit_java_newdoublearray(env, ac, av); 01209 else 01210 jrv = NULL; 01211 freeobject(o); 01212 freebytes((char *)av,ac*sizeof(t_atom)); 01213 } else { 01214 jrv = NULL; 01215 } 01216 } else { 01217 jrv = jit_java_newdoublearray(env, 1, &a); 01218 } 01219 01220 return jrv; 01221 } 01222 01223 jstring JNICALL jit_java_jitobj_get_class(JNIEnv *env, jobject obj) 01224 { 01225 jstring ret; 01226 t_object *o = get_jit_java_jitobj(env,obj); 01227 01228 if(o) 01229 { 01230 ret = JIT_JAVA_JNI_CALL(env,NewStringUTF)(env,ob_name(o)); 01231 return ret; 01232 } 01233 return NULL; 01234 } 01235 01236 jboolean JNICALL jit_java_jitobj_understands(JNIEnv *env, jobject obj, jstring msg) 01237 { 01238 char *s; 01239 jboolean res; 01240 t_object *o = get_jit_java_jitobj(env,obj); 01241 01242 if(o) 01243 { 01244 //may want to revisit w/r/t typedwrapper -jkc 01245 s = (char *)JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env,msg,NULL); 01246 res = zgetfn(o,gensym(s)) ? JNI_TRUE : JNI_FALSE; 01247 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env,msg,s); 01248 return res; 01249 } 01250 return JNI_FALSE; 01251 } 01252 01253 //handle jitobj + other stuff 01254 t_jit_err jit_java_init(void) 01255 { 01256 JNIEnv *env=NULL; 01257 t_jit_err err = JIT_ERR_GENERIC; 01258 static int inited = 0; 01259 char filename[MAX_PATH_CHARS]; 01260 short vol; 01261 long type; 01262 01263 if (inited||_cfm_in_ub) 01264 return JIT_ERR_NONE; 01265 01266 sprintf(filename,"jitter.jar"); 01267 if (locatefile_extended(filename,&vol,&type,0L,0)) 01268 return err; 01269 01270 ps_global_jvm = gensym("_#MAX_JAVA_VM#_"); 01271 #if (JIT_JAVA_USE_CFM) 01272 ps_global_cfm_env = gensym("_#MAX_JAVA_CFM_ENV#_"); 01273 ps_global_invoke_interface = gensym("_#MAX_JAVA_CFM_INVOKE#_"); 01274 #endif //JIT_JAVA_USE_CFM 01275 01276 ps_bang = gensym("bang"); 01277 ps_int = gensym("int"); 01278 ps_float = gensym("float"); 01279 ps_jitter = gensym("jitter"); 01280 ps_registeredname = gensym("registeredname"); 01281 ps_jit_matrix = gensym("jit_matrix"); 01282 ps_jit_matrix_wrapper = gensym("jit_matrix_wrapper"); 01283 ps_matrix_calc = gensym("matrix_calc"); 01284 ps_chuck = gensym("chuck"); 01285 ps_append = gensym("append"); 01286 ps_getmatrix = gensym("getmatrix"); 01287 ps_jit_linklist = gensym("jit_linklist"); 01288 ps_class_string = gensym("java.lang.String"); 01289 ps_class_jitter_object = gensym("com.cycling74.jitter.JitterObject"); 01290 ps_class_jitter_matrix = gensym("com.cycling74.jitter.JitterMatrix"); 01291 01292 if (!ps_global_jvm->s_thing) { 01293 t_object *p; 01294 t_atom a; 01295 jit_atom_setsym(&a,gensym("com.cycling74.jitter.JitterInstallUtility")); 01296 if (p=newinstance(gensym("mxj"),1,&a)) 01297 freeobject(p); 01298 if (!ps_global_jvm->s_thing) { 01299 error("Jitter Java support: could not find jvm"); 01300 return err; 01301 } 01302 } 01303 01304 g_jvm = (JavaVM *) ps_global_jvm->s_thing; 01305 #if (JIT_JAVA_USE_CFM) 01306 g_jenv = (t_cfm_jni_env *) ps_global_cfm_env->s_thing; 01307 g_jvm_invoke = (t_cfm_invoke_interface *) ps_global_invoke_interface->s_thing; 01308 #endif //JIT_JAVA_USE_CFM 01309 THREADENV(env); 01310 01311 JIT_JAVA_JNI_CALL(env,PushLocalFrame)(env,JIT_JAVA_FRAME_SIZE); 01312 01313 g_jit_java_jitobj_clazz = jit_java_getclassbyname(env, JIT_JAVA_JITOBJ_CLASSNAME); 01314 checkException(env); 01315 if (!g_jit_java_jitobj_clazz) { 01316 error("could not find jitter.jar"); 01317 goto out; 01318 } 01319 g_jit_java_p_jitobj_fid = JIT_JAVA_JNI_CALL(env,GetFieldID)(env, g_jit_java_jitobj_clazz, JIT_JAVA_JITOBJ_PTR_FIELD, "J"); 01320 checkException(env); 01321 jit_java_jitobj_register_natives(env,g_jit_java_jitobj_clazz); 01322 checkException(env); 01323 01324 g_atom_clazz = jit_java_getclassbyname(env, "com/cycling74/max/Atom"); 01325 checkException(env); 01326 g_string_clazz = jit_java_getclassbyname(env,"java/lang/String"); 01327 checkException(env); 01328 g_object_clazz = jit_java_getclassbyname(env,"java/lang/Object"); 01329 checkException(env); 01330 01331 g_newIntAtom_MID = JIT_JAVA_JNI_CALL(env,GetStaticMethodID)(env, g_atom_clazz,NEW_INT_ATOM_MNAME, NEW_INT_ATOM_SIG); 01332 checkException(env); 01333 g_newFloatAtom_MID = JIT_JAVA_JNI_CALL(env,GetStaticMethodID)(env, g_atom_clazz, NEW_FLOAT_ATOM_MNAME, NEW_FLOAT_ATOM_SIG); 01334 checkException(env); 01335 g_newStringAtom_MID = JIT_JAVA_JNI_CALL(env,GetStaticMethodID)(env, g_atom_clazz, NEW_STRING_ATOM_MNAME, NEW_STRING_ATOM_SIG); 01336 checkException(env); 01337 g_getIntValue_MID = JIT_JAVA_JNI_CALL(env,GetMethodID)(env, g_atom_clazz,GET_INT_VALUE_MNAME, GET_INT_VALUE_SIG); 01338 checkException(env); 01339 g_getFloatValue_MID = JIT_JAVA_JNI_CALL(env,GetMethodID)(env, g_atom_clazz, GET_FLOAT_VALUE_MNAME, GET_FLOAT_VALUE_SIG); 01340 checkException(env); 01341 g_getStringValue_MID = JIT_JAVA_JNI_CALL(env,GetMethodID)(env, g_atom_clazz, GET_STRING_VALUE_MNAME, GET_STRING_VALUE_SIG); 01342 checkException(env); 01343 g_getAtomType_MID = JIT_JAVA_JNI_CALL(env,GetMethodID)(env, g_atom_clazz, GET_ATOM_TYPE_MNAME, GET_ATOM_TYPE_SIG); 01344 checkException(env); 01345 01346 jit_java_jitmatrix_init(); 01347 jit_java_jitlistener_init(); 01348 if (g_jit_java_jitobj_clazz&&g_jit_java_jitmatrix_clazz) 01349 post("Jitter Java support installed"); 01350 else { 01351 error("could not install Jitter Java support."); 01352 post("check to make sure jitter.jar is in the mxj classpath"); 01353 } 01354 inited = 1; 01355 err = JIT_ERR_NONE; 01356 out: 01357 JIT_JAVA_JNI_CALL(env,PopLocalFrame)(env,NULL); 01358 return err; 01359 } 01360 01361 void jit_java_jitobj_register_natives(JNIEnv *env, jclass clazz) 01362 { 01363 int i,count=0; 01364 JNINativeMethod methods[] = 01365 { 01366 { "_new","(Ljava/lang/String;[Lcom/cycling74/max/Atom;)J",jit_java_jitobj_new}, 01367 { "_free","()V", jit_java_jitobj_free }, 01368 { "freePeer","()V", jit_java_jitobj_free }, 01369 { "bang","()[Lcom/cycling74/max/Atom;",jit_java_jitobj_bang}, 01370 { "send","(I)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_int }, 01371 { "send","(F)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_float }, 01372 01373 { "send","(Ljava/lang/String;[Lcom/cycling74/max/Atom;)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send }, 01374 { "send","(Ljava/lang/String;I)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_msg_int }, 01375 { "send","(Ljava/lang/String;[I)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_msg_intarray }, 01376 { "send","(Ljava/lang/String;F)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_msg_float }, 01377 { "send","(Ljava/lang/String;[F)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_msg_floatarray }, 01378 { "send","(Ljava/lang/String;Ljava/lang/String;)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_msg_string }, 01379 { "send","(Ljava/lang/String;[Ljava/lang/String;)[Lcom/cycling74/max/Atom;",jit_java_jitobj_send_msg_stringarray }, 01380 01381 // could do doubles and other types (also single atom) 01382 01383 { "setAttr","(Ljava/lang/String;[Lcom/cycling74/max/Atom;)Z",jit_java_jitobj_setattr }, 01384 { "setAttr","(Ljava/lang/String;I)Z",jit_java_jitobj_setattr_int }, 01385 { "setAttr","(Ljava/lang/String;[I)Z",jit_java_jitobj_setattr_intarray }, 01386 { "setAttr","(Ljava/lang/String;F)Z",jit_java_jitobj_setattr_float }, 01387 { "setAttr","(Ljava/lang/String;[F)Z",jit_java_jitobj_setattr_floatarray }, 01388 { "setAttr","(Ljava/lang/String;Ljava/lang/String;)Z",jit_java_jitobj_setattr_string }, 01389 { "setAttr","(Ljava/lang/String;[Ljava/lang/String;)Z",jit_java_jitobj_setattr_stringarray }, 01390 // could do doubles and other types (also single atom) 01391 01392 { "getAttr","(Ljava/lang/String;)[Lcom/cycling74/max/Atom;",jit_java_jitobj_getattr }, 01393 { "getAttrInt","(Ljava/lang/String;)I",jit_java_jitobj_getattr_int }, 01394 { "getAttrIntArray","(Ljava/lang/String;)[I",jit_java_jitobj_getattr_intarray }, 01395 { "getAttrFloat","(Ljava/lang/String;)F",jit_java_jitobj_getattr_float }, 01396 { "getAttrFloatArray","(Ljava/lang/String;)[F",jit_java_jitobj_getattr_floatarray }, 01397 { "getAttrString","(Ljava/lang/String;)Ljava/lang/String;",jit_java_jitobj_getattr_string }, 01398 { "getAttrStringArray","(Ljava/lang/String;)[Ljava/lang/String;",jit_java_jitobj_getattr_stringarray }, 01399 // could do doubles and other types (also single atom) 01400 01401 { "getRegisteredName","()Ljava/lang/String;",jit_java_jitobj_getregisteredname }, 01402 01403 { "matrixcalc","(Ljava/lang/Object;Ljava/lang/Object;)Z",jit_java_jitobj_matrixcalc }, 01404 01405 // JitterMatrix class will have special methods for just about everything 01406 01407 { "getJitterClass","()Ljava/lang/String;",jit_java_jitobj_get_class }, 01408 { "understands","(Ljava/lang/String;)Z",jit_java_jitobj_understands}, 01409 { NULL, NULL, NULL } 01410 }; 01411 01412 if (!clazz) 01413 return; 01414 while (methods[count].name) count++; 01415 JIT_JAVA_JNI_CALL(env,RegisterNatives)(env,clazz,methods,count); 01416 checkException(env); 01417 } 01418 01419 01420 /*----------------------------------------------------------- 01421 * 01422 * utlilty functions 01423 * 01424 *-----------------------------------------------------------*/ 01425 01426 int checkException(JNIEnv *env) 01427 { 01428 if (JIT_JAVA_JNI_CALL(env,ExceptionCheck)(env)) { 01429 JIT_JAVA_JNI_CALL(env,ExceptionDescribe)(env); 01430 return 1; 01431 } 01432 return 0; 01433 } 01434 01435 jclass jit_java_getclassbyname(JNIEnv *env, char *className) 01436 { 01437 jclass l_class = NULL; 01438 jclass g_class = NULL; 01439 01440 JIT_JAVA_JNI_CALL(env,PushLocalFrame)(env,JIT_JAVA_FRAME_SIZE); 01441 01442 JIT_JAVA_JNI_CALL(env,ExceptionClear)(env); 01443 l_class = JIT_JAVA_JNI_CALL(env,FindClass)(env, className); 01444 01445 if (JIT_JAVA_JNI_CALL(env,ExceptionCheck)(env) || (l_class == NULL)) { 01446 JIT_JAVA_JNI_CALL(env,ExceptionDescribe)(env); 01447 JIT_JAVA_JNI_CALL(env,ExceptionClear)(env); 01448 BAG2("Could not load class '%s'", className); 01449 } 01450 g_class = JIT_JAVA_JNI_CALL(env,NewGlobalRef)(env, l_class); 01451 if (g_class == NULL) { 01452 BAG2("Out of memory creating global ref for class '%s'", className); 01453 } 01454 01455 JIT_JAVA_JNI_CALL(env,PopLocalFrame)(env,NULL); 01456 return g_class; 01457 } 01458 01459 01460 jobject jit_java_newatom(JNIEnv *env, t_atom *a) 01461 { 01462 jobject l_result = NULL; 01463 01464 if (!a) 01465 return NULL; 01466 switch (a->a_type) { 01467 case A_LONG: 01468 l_result = JIT_JAVA_JNI_CALL(env,CallStaticObjectMethod)(env, g_atom_clazz, 01469 g_newIntAtom_MID, (jint)a->a_w.w_long); 01470 break; 01471 01472 case A_FLOAT: 01473 l_result = JIT_JAVA_JNI_CALL(env,CallStaticObjectMethod)(env, g_atom_clazz, 01474 g_newFloatAtom_MID, (jfloat)a->a_w.w_float); 01475 break; 01476 01477 case A_SYM: { 01478 jstring javaStr = JIT_JAVA_JNI_CALL(env,NewStringUTF)(env, a->a_w.w_sym->s_name); 01479 l_result = JIT_JAVA_JNI_CALL(env,CallStaticObjectMethod)(env, g_atom_clazz, 01480 g_newStringAtom_MID, 01481 javaStr); 01482 //we can do this since now the atom object has a ref to the string 01483 JIT_JAVA_JNI_CALL(env,DeleteLocalRef)(env,javaStr); 01484 break; 01485 } 01486 01487 default: 01488 error("jit_java_newatom: default (%d)", a->a_type); 01489 break; 01490 } 01491 01492 return l_result; 01493 } 01494 01495 jobjectArray jit_java_newatomarray(JNIEnv *env, short ac, t_atom *av) 01496 { 01497 jsize i; 01498 jobjectArray ja = JIT_JAVA_JNI_CALL(env,NewObjectArray)(env, ac, g_atom_clazz, NULL); 01499 01500 for (i = 0; i < ac; i++) { 01501 jobject atom = jit_java_newatom(env, av+i); 01502 JIT_JAVA_JNI_CALL(env,SetObjectArrayElement)(env, ja, i, atom); 01503 JIT_JAVA_JNI_CALL(env,DeleteLocalRef)(env,atom); 01504 } 01505 return ja; 01506 } 01507 01508 jintArray jit_java_newintarray(JNIEnv *env, short ac, t_atom *av) 01509 { 01510 jsize i; 01511 jint *vp; 01512 jintArray ja=0; 01513 01514 if (ac&&av) { 01515 vp = (jint *)jit_getbytes(ac * sizeof(jint)); 01516 ja = (jarray)JIT_JAVA_JNI_CALL(env,NewIntArray)(env,ac); 01517 checkException(env); 01518 01519 for(i=0;i<ac;i++) 01520 vp[i] = (jint)atom_getlong(av+i); 01521 01522 JIT_JAVA_JNI_CALL(env,SetIntArrayRegion)(env,(jintArray)ja,0,ac,(jint *)vp); 01523 checkException(env); 01524 01525 jit_freebytes(vp,ac*sizeof(jint)); 01526 } 01527 01528 return ja; 01529 } 01530 01531 jfloatArray jit_java_newfloatarray(JNIEnv *env, short ac, t_atom *av) 01532 { 01533 jsize i; 01534 jfloat *vp; 01535 jfloatArray ja=0; 01536 01537 if (ac&&av) { 01538 vp = (jfloat *)jit_getbytes(ac * sizeof(jfloat)); 01539 ja = (jarray)JIT_JAVA_JNI_CALL(env,NewFloatArray)(env,ac); 01540 checkException(env); 01541 01542 for(i=0;i<ac;i++) 01543 vp[i] = (jfloat)atom_getfloat(av+i); 01544 01545 JIT_JAVA_JNI_CALL(env,SetFloatArrayRegion)(env,(jfloatArray)ja,0,ac,(jfloat *)vp); 01546 checkException(env); 01547 01548 jit_freebytes(vp,ac*sizeof(jfloat)); 01549 } 01550 01551 return ja; 01552 } 01553 01554 jdoubleArray jit_java_newdoublearray(JNIEnv *env, short ac, t_atom *av) 01555 { 01556 jsize i; 01557 jdouble *vp; 01558 jdoubleArray ja=0; 01559 01560 if (ac&&av) { 01561 vp = (jdouble *)jit_getbytes(ac * sizeof(jdouble)); 01562 ja = (jarray)JIT_JAVA_JNI_CALL(env,NewFloatArray)(env,ac); 01563 checkException(env); 01564 01565 for(i=0;i<ac;i++) 01566 vp[i] = (jdouble)atom_getfloat(av+i); 01567 01568 JIT_JAVA_JNI_CALL(env,SetDoubleArrayRegion)(env,(jdoubleArray)ja,0,ac,(jdouble *)vp); 01569 checkException(env); 01570 01571 jit_freebytes(vp,ac*sizeof(jdouble)); 01572 } 01573 01574 return ja; 01575 } 01576 01577 t_atom *jit_java_newargv(JNIEnv *env, jobjectArray array, short *nElts) { 01578 short argc; 01579 t_atom *result; 01580 int i; 01581 01582 if(array == NULL) 01583 { 01584 *nElts = 0; 01585 return 0; 01586 } 01587 argc = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env, array); 01588 result = (t_atom *)jit_getbytes(argc * sizeof(t_atom)); 01589 01590 for (i = 0; i < argc; i++) { 01591 jobject javaAtom = JIT_JAVA_JNI_CALL(env,GetObjectArrayElement)(env, array, i); 01592 int javaAtomType = JIT_JAVA_JNI_CALL(env,CallIntMethod)(env, javaAtom, g_getAtomType_MID); 01593 01594 switch (javaAtomType) { 01595 case ATOM_TYPENUM_LONG: { 01596 long value = JIT_JAVA_JNI_CALL(env,CallIntMethod)(env, javaAtom, g_getIntValue_MID); 01597 SETLONG(&result[i], value); 01598 break; 01599 } 01600 01601 case ATOM_TYPENUM_FLOAT: { 01602 SETFLOAT(&result[i], JIT_JAVA_JNI_CALL(env,CallFloatMethod)(env, javaAtom, g_getFloatValue_MID)); 01603 break; 01604 } 01605 01606 case ATOM_TYPENUM_STRING: { 01607 jstring str = JIT_JAVA_JNI_CALL(env,CallObjectMethod)(env, javaAtom, g_getStringValue_MID); 01608 const char *chars = JIT_JAVA_JNI_CALL(env,GetStringUTFChars)(env, str, NULL); 01609 t_symbol *sym = gensym((char *)chars); 01610 SETSYM(&result[i], sym); 01611 JIT_JAVA_JNI_CALL(env,ReleaseStringUTFChars)(env, str, chars); 01612 JIT_JAVA_JNI_CALL(env,DeleteLocalRef)(env,str); 01613 break; 01614 } 01615 01616 default: { 01617 post("jit_java_newargv: default (%d)", javaAtomType); 01618 break; 01619 } 01620 } 01621 JIT_JAVA_JNI_CALL(env,DeleteLocalRef)(env, javaAtom); 01622 } 01623 (*nElts) = argc; 01624 return result; 01625 } 01626 01627 long jit_java_atomsfromintarray(JNIEnv *env, jintArray array, long count, t_atom *av) 01628 { 01629 long i,ac=0; 01630 jint *elements; 01631 jboolean is_copy; 01632 01633 if (array) { 01634 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 01635 if (count&&ac>count) 01636 ac = count; 01637 01638 elements = JIT_JAVA_JNI_CALL(env, GetIntArrayElements)(env,(jintArray)array,&is_copy); 01639 checkException(env); 01640 01641 for(i=0;i<ac;i++) 01642 atom_setlong(av+i,elements[i]); 01643 if (is_copy) 01644 { 01645 JIT_JAVA_JNI_CALL(env, ReleaseIntArrayElements)(env,(jintArray)array,elements,0); 01646 checkException(env); 01647 } 01648 01649 } 01650 return ac; 01651 } 01652 01653 long jit_java_atomsfromfloatarray(JNIEnv *env, jfloatArray array, long count, t_atom *av) 01654 { 01655 long i,ac=0; 01656 jfloat *elements; 01657 jboolean is_copy; 01658 01659 if (array) { 01660 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 01661 if (count&&ac>count) 01662 ac = count; 01663 01664 elements = JIT_JAVA_JNI_CALL(env, GetFloatArrayElements)(env,(jfloatArray)array,&is_copy); 01665 checkException(env); 01666 01667 for(i=0;i<ac;i++) 01668 atom_setfloat(av+i,elements[i]); 01669 if (is_copy) 01670 { 01671 JIT_JAVA_JNI_CALL(env, ReleaseFloatArrayElements)(env,(jfloatArray)array,elements,0); 01672 checkException(env); 01673 } 01674 01675 } 01676 return ac; 01677 } 01678 01679 long jit_java_atomsfromdoublearray(JNIEnv *env, jdoubleArray array, long count, t_atom *av) 01680 { 01681 long i,ac=0; 01682 jdouble *elements; 01683 jboolean is_copy; 01684 01685 if (array) { 01686 ac = JIT_JAVA_JNI_CALL(env,GetArrayLength)(env,array); 01687 if (count&&ac>count) 01688 ac = count; 01689 01690 elements = JIT_JAVA_JNI_CALL(env, GetDoubleArrayElements)(env,(jdoubleArray)array,&is_copy); 01691 checkException(env); 01692 01693 for(i=0;i<ac;i++) 01694 atom_setlong(av+i,elements[i]); 01695 if (is_copy) 01696 { 01697 JIT_JAVA_JNI_CALL(env, ReleaseDoubleArrayElements)(env,(jdoubleArray)array,elements,0); 01698 checkException(env); 01699 } 01700 01701 } 01702 return ac; 01703 }
Copyright © 2008, Cycling '74