'how to send jstring value to cfsetspeed baudrate value as an string not as integer

I'm trying to send a String via public native String to .cpp file as show below

extern "C" JNIEXPORT jstring JNICALL
Java_com_android_uart_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */,jstring msg, jstring foo)

Then I will call foo in cfsetspeed as an baudrate but the problem is that cfsetspeed only takes integer value. What I want is to set cfsetspeed baudrate value as string instead of integer value.

example for integer : cfsetispeed(&tty,B9600); B9600 is an integer as per the format.

Here is the code:

{
        asprintf(&str, "Hi\n");
        strlcpy(buffer, str, sizeof buffer);
        free(str);

        int ttyFD = 0;
        struct termios tty;
        const char *stringInC = env->GetStringUTFChars(msg, NULL);
        const char *stringInC1 = env->GetStringUTFChars(foo, NULL);
        auto SampleCmd =  stringInC;
        auto SampleCmd1 =  stringInC1;
        int i_WriteBytes = 0;

        memset (&tty, 0, sizeof tty);

        ttyFD = open("/dev/ttyS4", O_RDWR| O_NONBLOCK | O_NDELAY );

        if(ttyFD < 0)
        {
            asprintf(&str, "Error in opening /dev/ttyS4\n");
            strlcat(buffer, str, sizeof buffer);
            free(str);


        }
        else
        {
            asprintf(&str, "ttyS4 port opened successfully");
            strlcat(buffer, str, sizeof buffer);
            free(str);
        }
        if (tcgetattr ( ttyFD, &tty ) != 0 )
        {
            asprintf(&str, "Error from tcgetattr\n");
            strlcat(buffer, str, sizeof buffer);
            free(str);

        }
        cfsetispeed(&tty, SampleCmd1);

        tty.c_cflag &= ~PARENB;                            /* parity */
        tty.c_cflag &= ~CSTOPB;                            /* stop bits */
        //tty.c_cflag   &=  ~CSIZE;                             /* */
        tty.c_cflag |= CS8;                                /* data bits */
        tty.c_cflag &= ~CRTSCTS;                           /* no hardware flow control */
        tty.c_iflag &= ~(IXON | IXOFF | IXANY);            /* no s/w flow ctrl */
        tty.c_lflag = 0;                                  /* non canonical */
        tty.c_oflag = 0;                                  /* no remapping, no delays */
        tty.c_cc[VMIN] = 0;                                  /* read doesn't block */
        tty.c_cc[VTIME] = 0;                                  /* read timeout */
        tty.c_cflag |=
                CREAD | CLOCAL;                     /* turn on READ & ignore ctrl lines */
        tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);    /* */
        //tty.c_oflag     &=  ~OPOST;                           /* */
        tcflush(ttyFD, TCIFLUSH);
        if (tcsetattr(ttyFD, TCSANOW, &tty) != 0) {
            asprintf(&str, "Error from tcsetattr\n");
            strlcat(buffer, str, sizeof buffer);
            free(str);
        }
        i_WriteBytes = write(ttyFD, SampleCmd, strlen(SampleCmd));
        asprintf(&str, "written bytes = %d\n", i_WriteBytes);
        strlcat(buffer, str, sizeof buffer);
        free(str);

        if (i_WriteBytes < 0) {
            asprintf(&str, "failed to write value on port\n");
            strlcat(buffer, str, sizeof buffer);
            free(str);
        }
        sleep(1);
        char read_buf[2048];
        memset(&read_buf, '\0', sizeof(read_buf));
        int num_bytes = read(ttyFD, &read_buf, sizeof(read_buf));

        if (num_bytes < 0) {
            asprintf(&str, "Error reading: %s", strerror(errno));
            strlcat(buffer, str, sizeof buffer);
            free(str);
        }
        asprintf(&str, "Read bytes = %i \n Received message: %s", num_bytes, read_buf);
        strlcat(buffer, str, sizeof buffer);
        free(str);

        close(ttyFD);

        return env->NewStringUTF(buffer);
    }
    
            asprintf(&str, "Error reading: %s", strerror(errno));
            strlcat(buffer, str, sizeof buffer);
            free(str);
        }
        asprintf(&str, "Read bytes = %i \n Received message: %s", num_bytes, read_buf);
        strlcat(buffer, str, sizeof buffer);
        free(str);

        close(ttyFD);

        return env->NewStringUTF(buffer);
    }
c


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source