jstring Java_com_hid_usbjni_UsbJni_UsbBulkWriteRead(JNIEnv *env, jobject obj, jstring content) { int r; char scmd[1024] = {0}, rmsg[1024] = {0}; unsigned char sbuf[1024], rbuf[1024]; unsigned int slen, rlen = 0; INIT_RETURN_VALUE(); strncpy(scmd, str, sizeof(scmd) - 1); r = str_to_hex(scmd, sbuf, sizeof(sbuf)); if (r <= 0) { pdebug("str_to_hex error: r = %d\n", r); snprintf(rmsg, sizeof(rmsg), "str_to_hex error: ret = %d", r); r = -1; goto out; } slen = r; r = HID_write_read(NULL, sbuf, slen, rbuf, &rlen); if (r != 0) { snprintf(rmsg, sizeof(rmsg), "HID_write_read error: ret = %d", r); goto out; } if (NULL == hex_to_str(rbuf, rlen, rmsg, sizeof(rmsg))) { snprintf(rmsg, sizeof(rmsg), "hex_to_str error"); } r = 0; out: /* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */ (*env)->ReleaseStringUTFChars(env, content, (const char *)str); RETURN_VAL(r, rmsg); }
jstring Java_com_hid_usbjni_UsbJni_UsbJniVersion(JNIEnv *env, jobject obj, jstring content) { int r = 0; char rmsg[100] = {0}; INIT_RETURN_VALUE(); snprintf(rmsg, sizeof(rmsg), "v20150918B"); /* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */ (*env)->ReleaseStringUTFChars(env, content, (const char *)str); RETURN_VAL(r, rmsg); }
// Transfer execution to [fiber] coming from the current fiber whose stack has // [args]. // // [isCall] is true if [fiber] is being called and not transferred. // // [hasValue] is true if a value in [args] is being passed to the new fiber. // Otherwise, `null` is implicitly being passed. static PrimitiveResult runFiber(WrenVM* vm, ObjFiber* fiber, Value* args, bool isCall, bool hasValue) { if (isCall) { if (fiber->caller != NULL) RETURN_ERROR("Fiber has already been called."); // Remember who ran it. fiber->caller = vm->fiber; } else { // Edge case: If we are transferring to ourself, immediately return the // value. We can't treat this like an actual transfer since when we set the // return below, it would overwrite the fiber being transferred to. if (fiber == vm->fiber) RETURN_VAL(hasValue ? args[1] : NULL_VAL); } if (fiber->numFrames == 0) { args[0] = wrenStringFormat(vm, "Cannot $ a finished fiber.", isCall ? "call" : "transfer to"); return PRIM_ERROR; } if (fiber->error != NULL) { args[0] = wrenStringFormat(vm, "Cannot $ an aborted fiber.", isCall ? "call" : "transfer to"); return PRIM_ERROR; } // When the calling fiber resumes, we'll store the result of the call in its // stack. If the call has two arguments (the fiber and the value), we only // need one slot for the result, so discard the other slot now. if (hasValue) vm->fiber->stackTop--; // If the fiber was paused, make yield() or transfer() return the result. if (fiber->stackTop > fiber->stack) { *(fiber->stackTop - 1) = hasValue ? args[1] : NULL_VAL; } return PRIM_RUN_FIBER; }
jstring Java_com_hid_usbjni_UsbJni_UsbOpen(JNIEnv *env, jobject obj, jstring content) { int r = 0; char rmsg[1024] = {0}; INIT_RETURN_VALUE(); if (NULL == (HANDLE)HID_OpenReader(0)) { r = -1; snprintf(rmsg, sizeof(rmsg), "HID_OpenReader FAIL"); goto out; } r = 0; snprintf(rmsg, sizeof(rmsg), "HID_OpenReader OK"); out: /* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */ (*env)->ReleaseStringUTFChars(env, content, (const char *)str); RETURN_VAL(r, rmsg); }
jstring Java_com_hid_usbjni_UsbJni_UsbClose(JNIEnv *env, jobject obj, jstring content) { int r; char rmsg[1024] = {0}; INIT_RETURN_VALUE(); // r = TF_CloseReader(NULL); r = HID_CloseReader(NULL); if (r != 0) { if (r == -1) snprintf(rmsg, sizeof(rmsg), "dev not opened"); else snprintf(rmsg, sizeof(rmsg), "close fail"); goto out; } r = 0; snprintf(rmsg, sizeof(rmsg), "close OK"); out: /* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */ (*env)->ReleaseStringUTFChars(env, content, (const char *)str); RETURN_VAL(r, rmsg); }