From 69b6468399fecb74fa617d28203bdb1cbc519437 Mon Sep 17 00:00:00 2001 From: itas109 Date: Sun, 2 Feb 2025 00:21:13 +0800 Subject: [PATCH] feat(android): function getAvaiablePorts support android --- .../app/src/main/cpp/CMakeLists.txt | 4 +- include/CSerialPort/ilog.hpp | 22 ++++++++- include/CSerialPort/iutils.hpp | 47 ++++++++++--------- src/SerialPortInfoUnixBase.cpp | 12 +++-- 4 files changed, 57 insertions(+), 28 deletions(-) diff --git a/examples/CommAndroid/app/src/main/cpp/CMakeLists.txt b/examples/CommAndroid/app/src/main/cpp/CMakeLists.txt index 31ed9d7..96a543d 100644 --- a/examples/CommAndroid/app/src/main/cpp/CMakeLists.txt +++ b/examples/CommAndroid/app/src/main/cpp/CMakeLists.txt @@ -51,5 +51,5 @@ set(CMAKE_SWIG_FLAGS -package ${JAVA_GEN_PACKAGE}) # swig -java -c++ -outdir generate -I../../include -package com.itas109.cserialport.jni cserialport.i swig_add_library(${PROJECT_NAME} LANGUAGE java SOURCES cserialport.i ${CSerialPortSourceFiles}) -# find_library( log-lib log ) -# target_link_libraries( ${PROJECT_NAME} ${log-lib} ) \ No newline at end of file +find_library( log-lib log ) +target_link_libraries( ${PROJECT_NAME} ${log-lib} ) \ No newline at end of file diff --git a/include/CSerialPort/ilog.hpp b/include/CSerialPort/ilog.hpp index a3df1cc..536ab1d 100644 --- a/include/CSerialPort/ilog.hpp +++ b/include/CSerialPort/ilog.hpp @@ -21,6 +21,11 @@ #include "iutils.hpp" +#if defined(__ANDROID__) +#include +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "CSerialPort", __VA_ARGS__) +#endif + #ifdef _WIN32 #ifndef __func__ #define __func__ __FUNCTION__ @@ -104,6 +109,9 @@ class ILog char logMessage[2048]; itas109::IUtils::strFormat(logMessage, 2048, "%s [%s] %s - %s\n", currentTime, levelStr, function, formatMessage); m_logFile << logMessage; +#if defined(__ANDROID__) + LOGI("%s", logMessage); +#endif m_logFile.flush(); printf("%s", logMessage); } @@ -117,10 +125,20 @@ class ILog itas109::IUtils::strncpy(fileName, prefix, 40); getCurrentDate(fileName + itas109::IUtils::strlen(prefix)); itas109::IUtils::strncat(fileName, ".log", 45); - m_logFile.open(fileName, std::ios::out | std::ios::app); + char filePath[256]; +#if defined(__ANDROID__) + std::ifstream cmdlineFile("/proc/self/cmdline"); + std::string packageName; + std::getline(cmdlineFile, packageName); + itas109::IUtils::strFormat(filePath, 256, "/data/data/%s/%s", packageName.c_str(), fileName); + LOGI("log file path: %s", filePath); +#else + itas109::IUtils::strFormat(filePath, 256, "%s", fileName); +#endif + m_logFile.open(filePath, std::ios::out | std::ios::app); if (!m_logFile.is_open()) { - fprintf(stderr, "could not open file %s\n", fileName); + fprintf(stderr, "could not open file %s\n", filePath); } } diff --git a/include/CSerialPort/iutils.hpp b/include/CSerialPort/iutils.hpp index 3a23575..b6d83c1 100644 --- a/include/CSerialPort/iutils.hpp +++ b/include/CSerialPort/iutils.hpp @@ -18,7 +18,12 @@ #define MACRO_TO_STRING(x) STRINGIFY(x) // get cpu cores headers -#if defined(_WIN32) +#if defined(__APPLE__) +#include // sysctlbyname +#elif defined(__ANDROID__) +#include // sysconf +#include // __system_property_get +#elif defined(_WIN32) #include // GetSystemInfo #include // _T @@ -28,12 +33,9 @@ #elif defined(__linux__) #include // sysconf -#elif defined(__APPLE__) -#include // sysctlbyname #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) #include // sysctlbyname -#elif defined(__ANDROID__) -#include // sysconf + #elif defined(__unix__) #include // sysconf #else @@ -337,14 +339,14 @@ class IUtils return NULL; } -#if defined(_WIN32) +#if defined(__APPLE__) + strncpy(osName, "macOS", len); +#elif defined(__ANDROID__) + strncpy(osName, "Android", len); +#elif defined(_WIN32) strncpy(osName, "Windows", len); #elif defined(__linux__) strncpy(osName, "Linux", len); -#elif defined(__APPLE__) - strncpy(osName, "MacOS", len); -#elif defined(__ANDROID__) - strncpy(osName, "Android", len); #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) strncpy(osName, "BSD", len); #elif defined(__unix__) @@ -362,7 +364,14 @@ class IUtils return NULL; } -#if defined(_WIN32) +#if defined(__APPLE__) + strncpy(productName, "macOS", len); +#elif defined(__ANDROID__) + char version[15]; + __system_property_get("ro.build.version.release", version); + strncpy(productName, "Android ", len); + strncat(productName, version, 15); +#elif defined(_WIN32) int majorVersion = 0; int minorVersion = 0; HKEY hKey; @@ -446,10 +455,6 @@ class IUtils } strncpy(productName, prettyName, len); -#elif defined(__APPLE__) - strncpy(productName, "MacOS", len); -#elif defined(__ANDROID__) - strncpy(productName, "Android", len); #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) strncpy(productName, "BSD", len); #elif defined(__unix__) @@ -464,17 +469,17 @@ class IUtils { int numOfProcessors = 0; -#if defined(_WIN32) +#if defined(__APPLE__) + size_t size = sizeof(numOfProcessors); + sysctlbyname("hw.ncpu", &numOfProcessors, &size, NULL, 0); +#elif defined(__ANDROID__) + numOfProcessors = sysconf(_SC_NPROCESSORS_ONLN); +#elif defined(_WIN32) SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); numOfProcessors = sysInfo.dwNumberOfProcessors; #elif defined(__linux__) numOfProcessors = sysconf(_SC_NPROCESSORS_ONLN); -#elif defined(__APPLE__) - size_t size = sizeof(numOfProcessors); - sysctlbyname("hw.ncpu", &numOfProcessors, &size, NULL, 0); -#elif defined(__ANDROID__) - numOfProcessors = sysconf(_SC_NPROCESSORS_ONLN); #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) size_t size = sizeof(numOfProcessors); sysctlbyname("hw.ncpu", &numOfProcessors, &size, NULL, 0); diff --git a/src/SerialPortInfoUnixBase.cpp b/src/SerialPortInfoUnixBase.cpp index f22ddb9..e53c9fb 100644 --- a/src/SerialPortInfoUnixBase.cpp +++ b/src/SerialPortInfoUnixBase.cpp @@ -9,7 +9,12 @@ #include // readlink close #ifdef I_OS_ANDROID -#include //basename(POSIX) +// #include //basename(POSIX) +const char *basename(const char *path) // basename(GNU) +{ + const char *p = strrchr(path, '/'); + return p ? p + 1 : path; +} #endif #include //basename(GNU) memset strcmp @@ -43,7 +48,7 @@ void getDriver(const char *tty, char *driverName) { // /sys/class/tty/ttyUSB0/device/driver char driverDir[256] = {0}; - itas109::IUtils::strFormat(driverDir, 256, "%s/driver", deviceDir); + itas109::IUtils::strFormat(driverDir, 256, "%s/driver", (const char *)deviceDir); // android need const char* char buffer[256] = {0}; // VCs, ptys, etc don't have /sys/class/tty//device/driver @@ -171,7 +176,8 @@ void getTtyPortInfoListLinux(std::vector &ttyComList, std::vector< } #ifdef I_OS_ANDROID -static int _versionsort(const struct dirent **a, const struct dirent **b) { +static int _versionsort(const struct dirent **a, const struct dirent **b) +{ return strcmp((*a)->d_name, (*b)->d_name); } #endif