void sampleMethod(JXValue *params, int argc) { JXValue obj; JX_CreateArrayObject(&obj); JX_SetIndexedProperty(&obj, 0, params+0); JX_SetIndexedProperty(&obj, 1, params+1); // return JX_SetObject(params + argc, &obj); JX_Free(&obj); }
JNIEXPORT jlong JNICALL Java_io_jxcore_node_jxcore_callCBArray(JNIEnv *env, jobject thiz, jstring ev_name, jobjectArray params, jint size) { if (eventCB.type_ == 0) { error_console("event callback is not ready yet."); return 0; } const char *str_ev = env->GetStringUTFChars(ev_name, 0); long ret_val = 0; JXValue args[2]; if (JX_CreateArrayObject(&args[1])) { JX_New(&args[0]); JX_SetString(&args[0], str_ev, 0); jclass boolClass = env->FindClass("java/lang/Boolean"); jclass doubleClass = env->FindClass("java/lang/Double"); jclass intClass = env->FindClass("java/lang/Integer"); jclass strClass = env->FindClass("java/lang/String"); jclass barrClass = env->FindClass("[B"); for (int i = 0; i < (int)size; i++) { jobject elm = (jobject)env->GetObjectArrayElement(params, i); JXValue val; JX_New(&val); if (elm == NULL) { JX_SetNull(&val); } else if (env->IsInstanceOf(elm, boolClass) == JNI_TRUE) { jmethodID bvalID = env->GetMethodID(boolClass, "booleanValue", "()Z"); bool nval = (bool)env->CallBooleanMethod(elm, bvalID); JX_SetBoolean(&val, nval); } else if (env->IsInstanceOf(elm, intClass) == JNI_TRUE) { jmethodID bvalID = env->GetMethodID(intClass, "intValue", "()I"); int nval = (int)env->CallIntMethod(elm, bvalID); JX_SetInt32(&val, nval); } else if (env->IsInstanceOf(elm, doubleClass) == JNI_TRUE) { jmethodID bvalID = env->GetMethodID(doubleClass, "doubleValue", "()D"); double nval = (double)env->CallDoubleMethod(elm, bvalID); JX_SetDouble(&val, nval); } else if (env->IsInstanceOf(elm, strClass) == JNI_TRUE) { jstring jstr = (jstring)elm; const char *str = env->GetStringUTFChars(jstr, 0); JX_SetString(&val, str, strlen(str)); env->ReleaseStringUTFChars(jstr, str); } else if (env->IsInstanceOf(elm, barrClass) == JNI_TRUE) { jbyteArray jarr = (jbyteArray)elm; int len = env->GetArrayLength(jarr); jbyte *barr = env->GetByteArrayElements(jarr, 0); JX_SetBuffer(&val, (char *)barr, len); env->ReleaseByteArrayElements(jarr, barr, JNI_ABORT); } JX_SetIndexedProperty(&args[1], i, &val); JX_Free(&val); env->DeleteLocalRef(elm); } env->DeleteLocalRef(boolClass); env->DeleteLocalRef(doubleClass); env->DeleteLocalRef(intClass); env->DeleteLocalRef(strClass); env->DeleteLocalRef(barrClass); JXValue out; JX_CallFunction(&eventCB, args, 2, &out); JX_Free(&args[0]); JX_Free(&args[1]); if (!JX_IsNull(&out) && !JX_IsUndefined(&out)) ret_val = JX_StoreValue(&out); else ret_val = -1; } else { error_console("couldn't create JXValue Object"); } env->ReleaseStringUTFChars(ev_name, str_ev); return ret_val; }