int main(int argc, char **args) { JX_Initialize(args[0], callback); JX_InitializeNewEngine(); JX_DefineMainFile(contents); JX_DefineExtension("sampleMethod", sampleMethod); JX_StartEngine(); while (JX_LoopOnce() != 0) usleep(1); JXValue *params[2] = {param1, param2}; JXValue out; // call fnc -> JS side function // we had made this variable persistent inside sampleMethod JX_CallFunction(fnc, *params, 2, &out); // we need to clear persistent and then free whenever we // are done with persistent values to not to leak JX_ClearPersistent(fnc); JX_Free(fnc); JX_ClearPersistent(param1); JX_Free(param1); JX_ClearPersistent(param2); JX_Free(param2); assert(JX_GetDataLength(&out) == 11 && "Expected return value was 'test{\"a\":3}"); JX_Free(&out); assert(out.data_ == NULL && out.size_ == 0 && "JX_FreeResultData leaks?"); JX_StopEngine(); }
JNIEXPORT jlong JNICALL Java_io_jxcore_node_jxcore_callCBString(JNIEnv *env, jobject thiz, jstring ev_name, jstring param, jint json) { if (eventCB.type_ == 0) { error_console("event callback is not ready yet."); return 0; } const char *str_ev = env->GetStringUTFChars(ev_name, 0); const char *str_param = env->GetStringUTFChars(param, 0); long ret_val = 0; JXValue args[2]; if (JX_CreateEmptyObject(&args[1])) { JXValue jx_str_param; JX_New(&args[0]); JX_New(&jx_str_param); JX_SetString(&args[0], str_ev, 0); JX_SetString(&jx_str_param, str_param, 0); if (json != 1) JX_SetNamedProperty(&args[1], "str", &jx_str_param); else JX_SetNamedProperty(&args[1], "json", &jx_str_param); JX_Free(&jx_str_param); 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); env->ReleaseStringUTFChars(param, str_param); return ret_val; }
// native sampleMethod void sampleMethod(JXValue *results, int argc) { for (int i = 0; i < argc; i++) { std::string str; ConvertResult(&results[i], str); if (compare_base[i] != str.c_str()[0]) { flush_console("FAIL! Item(%d) : %s \n", i, str.c_str()); exit(-1); } } JXValue out; // fnc represents the JS side function fnc = &results[9]; param1 = results + 3; param2 = results + 4; // call JS side fnc with 2 parameters and get // the result to 'out' JX_CallFunction(fnc, (results + 3), 2, &out); // make fnc persistent so we can call it later again // see 'int main' for second call JX_MakePersistent(fnc); JX_MakePersistent(param1); JX_MakePersistent(param2); assert(JX_GetDataLength(&out) == 11 && "Expected return value was 'test{\"a\":3}"); JX_Free(&out); assert(out.data_ == NULL && out.size_ == 0 && "JX_FreeResultData leaks?"); }
JNIEXPORT jint JNICALL Java_io_jxcore_node_jxcore_getBoolean(JNIEnv *env, jobject thiz, jlong id) { if (id < 0) return JX_GetBoolean(cb_values + (id + 3)) ? 1 : 0; JXValue *val = JX_RemoveStoredValue(0, id); int n = JX_GetBoolean(val) ? 1 : 0; JX_Free(val); return n; }
JNIEXPORT jdouble JNICALL Java_io_jxcore_node_jxcore_getDouble(JNIEnv *env, jobject thiz, jlong id) { if (id < 0) return JX_GetDouble(cb_values + (id + 3)); JXValue *val = JX_RemoveStoredValue(0, id); int n = JX_GetDouble(val); JX_Free(val); return n; }
JNIEXPORT jint JNICALL Java_org_capriza_jxcore_jxcore_getInt32(JNIEnv *env, jobject thiz, jlong id) { if (id < 0) return JX_GetInt32(cb_values + (id + 3)); JXValue *val = JX_RemoveStoredValue(0, id); int n = JX_GetInt32(val); JX_Free(val); return n; }
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 jstring JNICALL Java_org_capriza_jxcore_jxcore_convertToString(JNIEnv *env, jobject thiz, jlong id) { JXValue *val; if (id < 0) val = cb_values + (id + 3); else val = JX_RemoveStoredValue(0, id); std::string str_result; ConvertResult(val, str_result); if (id >= 0) JX_Free(val); return env->NewStringUTF(str_result.c_str()); }
JNIEXPORT jstring JNICALL Java_io_jxcore_node_jxcore_getString(JNIEnv *env, jobject thiz, jlong id) { JXValue *val; if (id < 0) val = cb_values + (id + 3); else val = JX_RemoveStoredValue(0, id); char *chrp = JX_GetString(val); if (id >= 0) JX_Free(val); jstring js = env->NewStringUTF(chrp); free(chrp); return js; }
JNIEXPORT jbyteArray JNICALL Java_io_jxcore_node_jxcore_getBuffer(JNIEnv *env, jobject thiz, jlong id) { JXValue *val; if (id < 0) val = cb_values + (id + 3); else val = JX_RemoveStoredValue(0, id); char *arr = JX_GetString(val); int length = JX_GetDataLength(val); jbyteArray ret = env->NewByteArray(length); env->SetByteArrayRegion(ret, 0, length, (jbyte *)arr); free(arr); if (id >= 0) JX_Free(val); return ret; }
void sampleMethod(JXValue *results, int argc) { for (int i = 0; i < argc; i++) { std::string str; ConvertResult(&results[i], str); if (compare_base[i] != str.c_str()[0]) { flush_console("FAIL! Item(%d) : %s \n", i, str.c_str()); exit(-1); } } JXValue out; JX_CallFunction(&results[9], (results + 3), 2, &out); assert(JX_GetDataLength(&out) == 11 && "Expected return value was 'test{\"a\":3}"); JX_Free(&out); assert(out.data_ == NULL && out.size_ == 0 && "JX_FreeResultData leaks?"); }
int main(int argc, char **args) { JX_InitializeOnce("/test/bin/cpp/"); JX_InitializeNewEngine(); JX_DefineMainFile(contents); JX_StartEngine(); JXValue ret_val; JX_Evaluate("process.callMe()", "eval", &ret_val); while (JX_LoopOnce() != 0) usleep(1); assert(JX_IsError(&ret_val) && "error was expected"); std::string str; ConvertResult(&ret_val, str); assert(!strcmp("TypeError: this is type exception", str.c_str()) && "Exception output doesn't match"); JX_Free(&ret_val); JX_StopEngine(); }
int main(int argc, char **args) { JX_Initialize(args[0], callback); JX_InitializeNewEngine(); JX_DefineMainFile(contents); JX_DefineExtension("sampleMethod", sampleMethod); JX_StartEngine(); // loop for possible IO // or JX_Loop() without usleep / while while (JX_LoopOnce() != 0) usleep(1); JXValue result; JX_Evaluate(eval_str, "myscript", &result); JX_Free(&result); // loop for possible IO // or JX_Loop() without usleep / while while (JX_LoopOnce() != 0) usleep(1); JX_StopEngine(); assert(counter == 3 && "sampleMethod is expected to recive 3 calls (2 sub instance, 1 main)"); }
int main(int argc, char **args) { JX_Initialize(args[0], callback); JX_InitializeNewEngine(); JX_DefineMainFile(contents); JX_StartEngine(); JXValue ret_val; // this is not a function, it shouldn't return. // exception is expected JX_Evaluate("return process.x", "eval", &ret_val); while (JX_LoopOnce() != 0) usleep(1); assert(JX_IsError(&ret_val) && "error was expected"); JX_Free(&ret_val); JX_StopEngine(); return 0; }
JNIEXPORT void JNICALL Java_io_jxcore_node_jxcore_stopEngine(JNIEnv *env, jobject thiz) { JX_ClearPersistent(&eventCB); JX_Free(&eventCB); JX_StopEngine(); }
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; }