in src/main/c/Posix/SerialPort_Posix.c [389:432]
JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommPortsNative(JNIEnv *env, jclass serialComm)
{
// Mark this entire function as a critical section
pthread_mutex_lock(&criticalSection);
// Enumerate all ports on the current system
enumeratePorts();
// Create a Java-based port listing
jobjectArray arrayObject = (*env)->NewObjectArray(env, serialPorts.length, serialComm, 0);
for (int i = 0; !checkJniError(env, __LINE__ - 1) && (i < serialPorts.length); ++i)
{
// Create a new SerialComm object containing the enumerated values
jobject serialCommObject = (*env)->NewObject(env, serialComm, serialCommConstructor);
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, portDescriptionField, (*env)->NewStringUTF(env, serialPorts.ports[i]->portDescription));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, friendlyNameField, (*env)->NewStringUTF(env, serialPorts.ports[i]->friendlyName));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, comPortField, (*env)->NewStringUTF(env, serialPorts.ports[i]->portPath));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, portLocationField, (*env)->NewStringUTF(env, serialPorts.ports[i]->portLocation));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, serialNumberField, (*env)->NewStringUTF(env, serialPorts.ports[i]->serialNumber));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, manufacturerField, (*env)->NewStringUTF(env, serialPorts.ports[i]->manufacturer));
if (checkJniError(env, __LINE__ - 1)) break;
(*env)->SetObjectField(env, serialCommObject, deviceDriverField, (*env)->NewStringUTF(env, 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;
(*env)->SetBooleanField(env, serialCommObject, isSymlinkField, serialPorts.ports[i]->isSymlink);
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
pthread_mutex_unlock(&criticalSection);
return arrayObject;
}