in src/main/c/Windows/SerialPort_Windows.c [755:796]
JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommPortsNative(JNIEnv *env, jclass serialComm)
{
// Mark this entire function as a critical section
EnterCriticalSection(&criticalSection);
// Enumerate all ports on the current system
enumeratePorts(env);
// Get relevant SerialComm methods and fill in com port array
jobjectArray arrayObject = (*env)->NewObjectArray(env, serialPorts.length, serialComm, 0);
for (int i = 0; !checkJniError(env, __LINE__ - 1) && (i < serialPorts.length); ++i)
{
// Create new SerialComm object containing the enumerated values
jobject serialCommObject = (*env)->NewObject(env, serialComm, serialCommConstructor);
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, comPortField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->portPath, wcslen(serialPorts.ports[i]->portPath)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, friendlyNameField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->friendlyName, wcslen(serialPorts.ports[i]->friendlyName)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, portDescriptionField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->portDescription, wcslen(serialPorts.ports[i]->portDescription)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, portLocationField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->portLocation, wcslen(serialPorts.ports[i]->portLocation)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, serialNumberField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->serialNumber, wcslen(serialPorts.ports[i]->serialNumber)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, manufacturerField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->manufacturer, wcslen(serialPorts.ports[i]->manufacturer)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, deviceDriverField, (*env)->NewString(env, (jchar*)serialPorts.ports[i]->deviceDriver, wcslen(serialPorts.ports[i]->deviceDriver)));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetIntField(env, serialCommObject, vendorIdField, serialPorts.ports[i]->vendorID);
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetIntField(env, serialCommObject, productIdField, serialPorts.ports[i]->productID);
if (checkJniError(env, __LINE__ - 1)) break;
// Add new SerialComm object to array
(*env)->SetObjectArrayElement(env, arrayObject, i, serialCommObject);
}
// Exit critical section and return the com port array
LeaveCriticalSection(&criticalSection);
return arrayObject;
}