Habe es hinbekommen eine Java-Modul zu erstellen, aber unter Android 5.1.0 kann ich trotz root das Device nicht mit einer App direkt ansprechen. Habe mich jetzt mit einem socket-daemon der die Daten über TCP austauscht beholfen.
@Marco Feltmann
das ist mir schon klar, damit habe ich ja auch meine c++ .so Library erstellt. Das Java-Modul habe ich jetzt mit der jna-Library erstellt, wollte es aber direkt über jni machen.
Da ich aber nicht auf /dev/ttyACM0 direkt zugreifen kann, muß ich mich in jni erst mal nicht einarbeiten.
Beiträge von Bettman
-
-
Hallo,
ich habe eine vorhandene C++ Library zum steuern eines Radios über /dev/ttyACM0 mit einem Android Arm Toolchain erfolgreich erstellt. Das Testprogramm rufe ich über ein Terminal auf und das funktioniert auch. Ich möchte jetzt gerne die Library mit Java ansprechen, um das Radio mit einer Android App benutzerfreundlich zu steuern.
Wie kann ich das am besten tun ?
Radiolibrary.cpp :C
Alles anzeigenBOOL OpenRadioPort(LPCSTR port, BOOL usehardmute) { #ifdef _DEBUG AllocConsole(); #endif #ifdef WIN32 if(!hSerial) hSerial = CreateFileA(port, GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if (hSerial == INVALID_HANDLE_VALUE) return false; else { DCB dcbSerialParams ={0}; dcbSerialParams.DCBlength = sizeof(DCB); if (!GetCommState(hSerial, &dcbSerialParams)) return false; dcbSerialParams.BaudRate=CBR_57600; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; dcbSerialParams.fRtsControl=0; dcbSerialParams.fDtrControl=0; if (!SetCommState(hSerial, &dcbSerialParams)) { DWORD er=GetLastError(); return false; } COMMTIMEOUTS timeouts={0}; timeouts.ReadIntervalTimeout=10; timeouts.ReadTotalTimeoutConstant=10; timeouts.ReadTotalTimeoutMultiplier=10; timeouts.WriteTotalTimeoutConstant=10; timeouts.WriteTotalTimeoutMultiplier=10; if (!SetCommTimeouts(hSerial, &timeouts)) return false; bUseHardMute=usehardmute; if (usehardmute) HardMute(); else HardUnMute(); #endif #ifdef __linux__ struct termios options; #ifdef _LINUXDEBUG wprintf(L"Open radio port %s\n", port); #endif if(hSerial<1) hSerial = open(port, O_RDWR | O_NOCTTY | O_NDELAY); if (hSerial == -1) { perror("open_port: Unable to open radio port\n"); return false; } else { fcntl(hSerial, F_SETFL, 0); tcgetattr(hSerial, &options); cfsetispeed(&options, B57600); cfsetospeed(&options, B57600); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~CRTSCTS; /* set raw input, 1 second timeout */ options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG ); options.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 1; /* set the options */ tcsetattr(hSerial, TCSANOW, &options); ResetHigh(); ClearInputBuffer(); //HardResetRadio(); bUseHardMute=usehardmute; if (usehardmute) HardMute(); else HardUnMute(); #endif Sleep(800); if(!IsSysReady()) { for (int i=0;i<2;i++) { if(HardResetRadio()) { for(int x=0;x<2;x++) { if(IsSysReady()) { TotalProgram = GetTotalProgram(); return true; } } } } return false; } else { TotalProgram = GetTotalProgram(); return true; } } } BOOL CloseRadioPort(void) { #ifdef WIN32 if (hSerial) CloseHandle(hSerial); #endif #ifdef __linux__ if (hSerial) close(hSerial); #endif hSerial=NULL; return true; }
RadioLibrary.h:
Testprogramm.cpp :