JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommPortsNative()

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;
}