当前位置: 首页 > news >正文

20250416在荣品的PRO-RK3566开发板的Android13下编译native C的应用程序的步骤

mm编译的简略步骤以及详细LOG,仅供参考:
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ source build/envsetup.sh 
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ lunch
     57. rk3566_t-userdebug
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): 57
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ cd external/rk3566_tcp_server/
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0/external/rk3566_tcp_server$ mm
[100% 329/329] Install: out/target/product/rk3566_t/system/bin/rk3566_tcp_server

20250416在荣品的PRO-RK3566开发板的Android13下编译native C的应用程序的步骤
2025/4/16 19:05


缘起:2012年?前后,做freescale的i.MX6Q的Android4.0.4/Andorid4.2.2/Android4.4.2?的时候。
当年为了使用最高的效率来取摄像头的每一帧图像,不能使用APK/JAVA。
最后有人提高了使用native C的应用程序。

现在需要RK3566在Android13下将UART6接收到的的marvlink数据通过UART9/UART3转发出去。115200bps N 8 1。

荣品建议我们参考:Z:\hailuo_temp\Android13.0\external\sc16is752\Android.mk


可以参考这个安卓13 平台 添加对应测试的c 文件的

应用程序 弄好之后 直接使用 mm编译吗?
全局编译就行

已经全局编译了。现在 想单独 编译这个应用程序!
我这边都是全局编译生成的,没有单独编译的方式提供给你哈


Z:\hailuo_temp\Android13.0\external\sc16is752\Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := sc16is752.c 

LOCAL_MODULE := sc16is752

LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_OWNER := root
LOCAL_MODULE_GROUP := root
LOCAL_MODULE_SUFFIX := 

include $(BUILD_EXECUTABLE)


修改为:

Z:\hailuo_temp\Android13.0\external\uart6_2_uart3\Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := uart6_2_uart3.c 

LOCAL_MODULE := uart6_2_uart3

LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_OWNER := root
LOCAL_MODULE_GROUP := root
LOCAL_MODULE_SUFFIX := 

include $(BUILD_EXECUTABLE)


c_spi_and_i2c_test.patch

commit 57a43916bd5889852ca59d4a1d6d6d27320bf22f
Author: wjy <you@example.com>
Date:   Sat Nov 18 10:05:47 2023 +0000

    Add spi and i2c test

diff --git a/external/sc16is752/Android.mk b/external/sc16is752/Android.mk
new file mode 100644
index 0000000000..bd112a7621
--- /dev/null
+++ b/external/sc16is752/Android.mk
@@ -0,0 +1,14 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := sc16is752.c 
+
+LOCAL_MODULE := sc16is752
+
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE_OWNER := root
+LOCAL_MODULE_GROUP := root
+LOCAL_MODULE_SUFFIX := 
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/external/sc16is752/sc16is752.c b/external/sc16is752/sc16is752.c
new file mode 100644
index 0000000000..044bfc6e26
--- /dev/null
+++ b/external/sc16is752/sc16is752.c
@@ -0,0 +1,400 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/i2c-dev.h>
+#include <unistd.h>
+#include <linux/spi/spidev.h>
+#include <time.h>
+#include <getopt.h>
+#include <string.h>
+
+#define CHANNEL_A                   0x00
+#define CHANNEL_B                   0x01
+
+#define RHR                             0x00 //  Recv Holding Register 
+#define THR                             0x00 //  Xmit Holding Register 
+
+#define IODir                           0x0A  // I/O P:ins Direction Register
+#define IOState                         0x0B  // I/O Pins State Register
+#define IOIntEna                        0x0C  // I/O Interrupt Enable Register
+#define IOCONTROL                       0x0E  // I/O Pins Control Register
+
+#define IER                             0x01  // Interrupt Enable Register
+#define FCR                             0x02  // FIFO Control Register in WRITE Mode
+#define IIR                             0x02  // Interrupt Identification Register in READ Mode
+
+#define LCR                             0x03  // Line Control Register
+#define MCR                             0x04  // Modem Control Register
+#define LSR                             0x05  // Line status Register
+#define MSR                             0x06  // Modem Status Register
+#define SPR                             0x07  // ScratchPad Register
+#define TCR                             0x06  // Transmission Control Register
+#define TLR                             0x07  // Trigger Level Register
+#define TXLVL                           0x08  // Xmit FIFO Level Register
+#define RXLVL                           0x09  // Recv FIFO Level Register
+#define EFCR                          0x0F  // Extra Features Control Register
+
+#define DLL                             0x00  // Divisor Latch LSB  0x00
+#define DLH                             0x01  // Divisor Latch MSB  0x01
+
+#define EFR                               0x02 
+
+#define FREQ (1843200UL)
+#define BAUDRATE 9600
+
+#define CHANNEL CHANNEL_A
+#define chreg(reg) (reg << 3 | CHANNEL)
+
+typedef unsigned char u8;
+
+#define I2C 0x11
+#define SPI 0x22
+
+// 设备路径
+char *device;
+
+// 片选脚
+char *cs = "/proc/rp_gpio/gpio4c5";
+
+// 测试字符串
+char *tx = "spi or i2c test string";
+
+// 设备类型
+u8 type;
+
+// i2c 设备地址
+u8 addr = 0x4d;
+
+
+u8 read_reg(u8 reg);
+void open_dev();
+void write_reg(u8 reg, u8 val);
+void gpio_set(int val);
+
+int fd = -1;
+int fd_gpio = -1;
+
+
+struct timespec delay = {
+    .tv_sec = 0,
+    .tv_nsec = 100000
+};
+
+
+
+static inline u8 available_data()
+{
+    return read_reg(RXLVL);
+
+}
+
+void write_byte(u8 val)
+{
+    u8 lsr;
+
+    do{
+        lsr = read_reg(LSR);
+    }while((lsr & 0x20) == 0);
+
+    write_reg(THR, val);
+}
+
+u8 read_byte()
+{
+    return read_reg(RHR);;
+}
+
+void test_connect()
+{
+    u8 val;
+    write_reg(SPR, 0x77);
+    if((val = read_reg(SPR)) != 0x77){
+        printf("0x%02x != 0x77\n", val);
+        printf("connect failed\n");
+        exit(-1);
+    }
+    
+    write_reg(SPR, 0x99);
+    if((val = read_reg(SPR)) != 0x99){
+        printf("0x%02x != 0x99\n", val);
+        printf("connect failed\n");
+        exit(-2);
+    }
+
+    printf("connect okay\n");
+}
+
+
+u8 read_reg(u8 reg)
+{
+    reg = chreg(reg);
+    unsigned char val[2];
+
+
+    if(type == I2C){
+        if (write(fd, &reg, 1) != 1) {
+            perror("write failed");
+            exit(-3);
+        }
+
+        if (read(fd, &val[1], 1) != 1) {
+            perror("read failed");
+            exit(-4);
+        }
+    } else {
+        u8 buf[] = {0x80 | reg,  0xff};
+        struct spi_ioc_transfer tr = {
+            .tx_buf = (unsigned long)buf,
+            .rx_buf = (unsigned long)val,
+            .len = 2,
+            .delay_usecs = 10,
+            .bits_per_word = 8,
+        };
+
+
+        if(ioctl(fd, SPI_IOC_MESSAGE(1), &tr) < 0){
+            perror("ioctl failed");
+            exit(-5);
+        }
+    }
+
+    return val[1];
+}
+
+void write_reg(u8 reg, u8 val)
+{
+    reg = chreg(reg);
+    u8 buf[] = {reg, val};
+    
+    if(type == I2C){
+           if (write(fd, buf, 2) != 2) {
+            perror("Failed to write to the i2c bus.");
+            exit(-6);
+        }
+    } else {
+        struct spi_ioc_transfer tr = {
+            .tx_buf = (unsigned long)buf,
+        //    .rx_buf = (unsigned long)rxval,
+            .len = 2,
+        };
+
+        if(ioctl(fd, SPI_IOC_MESSAGE(1), &tr) < 0){
+            perror("ioctl failed");
+            exit(-7);
+        }
+    }
+}
+
+
+void set_baudrate()
+{
+    int prescale = 4;
+    u8 lcr;
+    unsigned int div;
+
+    if((read_reg(MCR) & 0x80) == 0)
+        prescale = 1;
+
+    div = (FREQ / prescale) / (BAUDRATE * 16);
+
+    lcr = read_reg(LCR);
+    lcr |= 0x80;
+    write_reg(LCR, lcr);
+
+    write_reg(DLL, (u8)div);
+    write_reg(DLH, (u8)(div >> 8));
+    
+    lcr &= 0x7f;
+    write_reg(LCR, lcr);
+}
+
+void set_line()
+{
+    u8 lcr;
+
+    lcr = read_reg(LCR);
+    lcr &= 0xC0;
+
+    lcr |= 0x03;
+
+    write_reg(LCR, lcr);
+}
+
+
+void reset()
+{
+    write_reg(IER, 0x0);
+    write_reg(IIR, 0x1);
+    write_reg(FCR, 0x0);
+    write_reg(LCR, 0x1d);
+    write_reg(MCR, 0x0);
+    write_reg(TCR, 0x0);
+    write_reg(TLR, 0x0);
+    write_reg(EFCR, 0x0);
+    read_reg(RHR);
+}
+
+void fifo_en()
+{
+    u8 fcr;
+
+    fcr = read_reg(FCR);
+    fcr |= 0x01;
+    write_reg(FCR, fcr);
+
+}
+void fifo_reset()
+{
+    u8 fcr;
+
+    fcr = read_reg(FCR);
+    fcr |= 0x06;
+    write_reg(FCR, fcr);
+}
+
+void init()
+{
+    fifo_en();
+    fifo_reset();
+    set_baudrate();
+    set_line();
+}
+
+void write_bytes(char *buf, size_t len)
+{
+    for(int i = 0; i < len; i ++){
+        write_byte(buf[i]);
+    }
+}
+
+void loop()
+{
+    size_t len = strlen(tx);
+
+    write_bytes(tx, len);
+    while(available_data() > 0){
+        printf("%c", read_byte());
+    }
+    printf("\n");
+}
+
+void open_dev()
+{
+    
+    if(type == I2C){
+        if ((fd = open(device, O_RDWR)) < 0) {
+            perror("open bus failed\n");
+            exit(-8);
+        }
+
+        if (ioctl(fd, I2C_SLAVE, addr) < 0) {
+             close(fd);
+            perror("failed access i2c dev\n");
+            exit(-9);
+        }
+
+    }else {
+        if ((fd = open(device, O_RDWR)) < 0) {
+            perror("open bus failed");
+            close(fd_gpio);
+            exit(-10);
+        }
+
+        u8 mode = SPI_MODE_0;
+        if (ioctl(fd, SPI_IOC_WR_MODE, &mode) < 0) {
+            perror("Error setting SPI mode");
+            close(fd);
+            close(fd_gpio);
+            exit(-11);
+        }
+        
+    }
+}
+
+
+void usage()
+{
+    puts("usage:");
+    puts("-d device, such as /dev/spidev0.0 or /dev/i2c-4\n"
+         "-s string, default is \"spi or i2c test string\"\n"
+         "\nexample:\n"
+         "./sc16is752  -d /dev/spidev0.0 -c /proc/rp_gpio/gpio4c5 -s \"TestString\"\n"
+         "./sc16is752  -d /dev/i2c-4  -s \"TestString\"\n");
+        
+    exit(-12);
+}
+
+void parse_cmd(int argc, char *argv[])
+{
+    static const struct option lopts[] = {
+        {"device", 1, 0, 'd'},  // 设备节点
+        {"tx", 1, 0, 's'},        // 传输的字符串
+        {"cs", 1, 0, 'c'},        // SPI 设备所使用的片选脚
+        {NULL, 0, 0, 0}
+    };
+
+
+    while(1){
+           int c = getopt_long(argc, argv, 
+                        "D:c:s:d:b:i:o:vS:I:", 
+                        lopts, NULL);
+        if(c == -1)
+            break;
+        
+        switch(c){
+            case 'd':
+                device = optarg;
+                break;
+            case 'c':
+                cs = optarg;
+                break;
+            case 's':
+                tx = optarg;
+                break;
+            default:
+                usage();
+        }
+    }
+
+    if(device == NULL){
+        printf("device is null\n");
+        exit(-13);
+    }
+
+    if(strstr(device, "i2c") != NULL)
+        type = I2C;
+    else if(strstr(device, "spi") != NULL)
+        type = SPI;
+    else {
+        printf("no i2c or spi device\n");
+        exit(-14);
+    }
+
+/*    if(type == SPI && cs == NULL){
+        printf("spi must set gpio pin\n");
+        exit(-1);
+    }
+    */
+}
+
+
+int main(int argc, char *argv[])
+{
+    
+    parse_cmd(argc, argv);
+    open_dev();
+
+    reset();
+
+    test_connect();
+
+    init();
+
+    loop();
+
+    close(fd);
+
+    return 0;
+}
+
diff --git a/vendor/rockchip/common/apps/DeviceTest/DeviceTest.apk b/vendor/rockchip/common/apps/DeviceTest/DeviceTest.apk
index b8149a8368..015cfb80a8 100755
Binary files a/vendor/rockchip/common/apps/DeviceTest/DeviceTest.apk and b/vendor/rockchip/common/apps/DeviceTest/DeviceTest.apk differ
 

完整的编译LOG:

rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ source build/envsetup.sh 
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ 
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ lunch

You're building on Linux

Lunch menu .. Here are the common combinations:
     1. PX30_t-user
     2. PX30_t-userdebug
     3. aosp_arm-eng
     4. aosp_arm64-eng
     5. aosp_bluejay_car-userdebug
     6. aosp_bramble_car-userdebug
     7. aosp_cf_arm64_auto-userdebug
     8. aosp_cf_arm64_phone-userdebug
     9. aosp_cf_x86_64_foldable-userdebug
     10. aosp_cf_x86_64_only_phone_hsum-userdebug
     11. aosp_cf_x86_64_pc-userdebug
     12. aosp_cf_x86_64_phone-userdebug
     13. aosp_cf_x86_64_tv-userdebug
     14. aosp_cf_x86_auto-userdebug
     15. aosp_cf_x86_phone-userdebug
     16. aosp_cf_x86_tv-userdebug
     17. aosp_coral_car-userdebug
     18. aosp_flame_car-userdebug
     19. aosp_oriole-userdebug
     20. aosp_oriole_car-userdebug
     21. aosp_raven-userdebug
     22. aosp_raven_car-userdebug
     23. aosp_redfin_car-userdebug
     24. aosp_slider-userdebug
     25. aosp_sunfish_car-userdebug
     26. aosp_whitefin-userdebug
     27. aosp_x86-eng
     28. aosp_x86_64-eng
     29. arm_krait-eng
     30. arm_v7_v8-eng
     31. armv8-eng
     32. armv8_cortex_a55-eng
     33. armv8_kryo385-eng
     34. beagle_x15-userdebug
     35. beagle_x15_auto-userdebug
     36. hikey-userdebug
     37. hikey64_only-userdebug
     38. hikey960-userdebug
     39. hikey960_tv-userdebug
     40. hikey_tv-userdebug
     41. qemu_trusty_arm64-userdebug
     42. rk3326_t-user
     43. rk3326_t-userdebug
     44. rk3326_tgo-user
     45. rk3326_tgo-userdebug
     46. rk3399_t-user
     47. rk3399_t-userdebug
     48. rk3528_box-user
     49. rk3528_box-userdebug
     50. rk3562_32bit-user
     51. rk3562_32bit-userdebug
     52. rk3562_t-user
     53. rk3562_t-userdebug
     54. rk3562_tgo-user
     55. rk3562_tgo-userdebug
     56. rk3566_t-user
     57. rk3566_t-userdebug
     58. rk3566_tgo-user
     59. rk3566_tgo-userdebug
     60. rk3568_t-user
     61. rk3568_t-userdebug
     62. rk3588_box-user
     63. rk3588_box-userdebug
     64. rk3588_s-user
     65. rk3588_s-userdebug
     66. rk3588_t-user
     67. rk3588_t-userdebug
     68. rk3588_xr-user
     69. rk3588_xr-userdebug
     70. rk3588m_car-user
     71. rk3588m_car-userdebug
     72. rk3588m_s-user
     73. rk3588m_s-userdebug
     74. rk3588s_s-user
     75. rk3588s_s-userdebug
     76. rk3588s_t-user
     77. rk3588s_t-userdebug
     78. sdk_car_arm-userdebug
     79. sdk_car_arm64-userdebug
     80. sdk_car_portrait_x86_64-userdebug
     81. sdk_car_x86-userdebug
     82. sdk_car_x86_64-userdebug
     83. sdk_pc_x86_64-userdebug
     84. silvermont-eng
     85. uml-userdebug
     86. yukawa-userdebug
     87. yukawa_sei510-userdebug

Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): 57

Hint: next time you can simply run 'lunch rk3566_t-userdebug'

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=13
TARGET_PRODUCT=rk3566_t
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=cortex-a55
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-2a
TARGET_2ND_CPU_VARIANT=cortex-a55
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.15.0-131-generic-x86_64-Ubuntu-20.04.6-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=TQ3C.230805.001.B2
OUT_DIR=out
============================================
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ 
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0$ cd external/rk3566_tcp_server/
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0/external/rk3566_tcp_server$ 
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0/external/rk3566_tcp_server$ ll
total 92
drwx------   2 rootroot rootroot  4096 4月  15 09:26 ./
drwxrwxr-x 388 rootroot rootroot 12288 4月  15 09:26 ../
-rwx------   1 rootroot rootroot   270 4月  10 18:20 Android.mk*
-rwx------   1 rootroot rootroot 30841 4月  10 18:16 rk3566_tcp_server_0410.c*
-rwx------   1 rootroot rootroot 32346 4月  11 18:10 rk3566_tcp_server.c*
-rwx------   1 rootroot rootroot  7228 2月  27 09:52 sc16is752.c*
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0/external/rk3566_tcp_server$ 
rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0/external/rk3566_tcp_server$ mm
build/make/core/soong_config.mk:209: warning: BOARD_PLAT_PUBLIC_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS instead.
build/make/core/soong_config.mk:210: warning: BOARD_PLAT_PRIVATE_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS instead.
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=13
TARGET_PRODUCT=rk3566_t
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=cortex-a55
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-2a
TARGET_2ND_CPU_VARIANT=cortex-a55
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.15.0-131-generic-x86_64-Ubuntu-20.04.6-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=TQ3C.230805.001.B2
OUT_DIR=out
============================================
device/rockchip/rk356x/rk3566_t/preinstall/preinstall.mk was modified, regenerating...
device/rockchip/rk356x/rk3566_t/preinstall_del_forever/preinstall.mk was modified, regenerating...
[100% 47/47] initializing build system ...
device/rockchip/common/prebuild.mk:2: warning: Generating manifest snapshot at out/commit_id.xml...
device/rockchip/common/prebuild.mk:3: warning: You can disable this by removing this and setting BOARD_RECORD_COMMIT_ID := false in BoardConfig.mk
[ 16% 53/324] including build/make/target/board/Android.mk ...
build fstab file with device/rockchip/common/scripts/fstab_tools/fstab.in....
rebuilding dtbo image with device/rockchip/rk356x/rk3566_t/dt-overlay.in....
build parameter.txt with device/rockchip/common/scripts/parameter_tools/parameter.in....
[ 25% 82/324] including device/rockchip/rk356x/Android.mk ...
device/rockchip/rk356x/rk3566_t/preinstall_del_forever/weixin8056android2800_0x2800383c_arm64/Android.mk:199: warning: MY_APP_LIB_PATH=out/target/product/rk3566_t/odm/bundled_uninstall_gone-app/weixin805
6android2800_0x2800383c_arm64/lib/arm64
[ 35% 115/324] including external/rk_tee_user/v2/Android.mk ...
'building rk_tee_user v2'
[ 56% 184/324] including hardware/rockchip/audio/Android.mk ...
"BUILD_BISTREAM_TEST"
[ 57% 186/324] including hardware/rockchip/camera_engine_rkisp/Android.mk ...
TARGET_BOARD_PLATFORM=rk356x
[ 73% 238/324] including system/sepolicy/Android.mk ...
system/sepolicy/Android.mk:57: warning: BOARD_PLAT_PUBLIC_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS instead.
system/sepolicy/Android.mk:62: warning: BOARD_PLAT_PRIVATE_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS instead.
[100% 324/324] writing build rules ...
build/make/core/Makefile:72: warning: overriding commands for target `out/target/product/rk3566_t/vendor/lib64/libril.so'
build/make/core/base_rules.mk:533: warning: ignoring old commands for target `out/target/product/rk3566_t/vendor/lib64/libril.so'
build/make/core/Makefile:72: warning: overriding commands for target `out/target/product/rk3566_t/system/bin/uart2tcp'
build/make/core/base_rules.mk:533: warning: ignoring old commands for target `out/target/product/rk3566_t/system/bin/uart2tcp'
[100% 329/329] Install: out/target/product/rk3566_t/system/bin/rk3566_tcp_server

#### build completed successfully (02:18 (mm:ss)) ####

rootroot@rootroot-X99-Turbo:~/hailuo_temp/Android13.0/external/rk3566_tcp_server$ 

相关文章:

20250416在荣品的PRO-RK3566开发板的Android13下编译native C的应用程序的步骤

mm编译的简略步骤以及详细LOG&#xff0c;仅供参考&#xff1a; rootrootrootroot-X99-Turbo:~/hailuo_temp/Android13.0$ source build/envsetup.sh rootrootrootroot-X99-Turbo:~/hailuo_temp/Android13.0$ lunch 57. rk3566_t-userdebug Pick from common choices abo…...

Pikachu靶场——Cross-Site Scripting

使用ubantu-linux虚拟机通过docker镜像本地搭建 一&#xff0c;反射型xss(get) 1&#xff0c;观察靶场环境&#xff0c;功能是提交你最喜欢的NBA球星 2&#xff0c;可以通过burp suite抓包分析一下 通过GET请求提交输入的姓名&#xff0c;这是及其危险的 3&#xff0c;尝试使用…...

ArkTS组件的三个通用(通用事件、通用属性、通用手势)

文章目录 通用事件点击事件 onClick触摸事件 onTouch挂载、卸载事件拖拽事件按键事件 onKeyEvent焦点事件鼠标事件悬浮事件组件区域变化事件 onAreaChange组件尺寸变化事件组件可见区域变化事件组件快捷键事件自定义事件分发自定义事件拦截 通用属性尺寸设置位置设置布局约束边…...

双token实现无感刷新

一、方案说明 1. 核心流程 ​用户登录​ 提交账号密码 → 服务端验证 → 返回Access Token&#xff08;前端存储&#xff09; Refresh Token&#xff08;HttpOnly Cookie&#xff09; ​业务请求​ 请求头携带Access Token → 服务端验证有效性 → 有效则返回数据 ​Token过…...

UE5游戏分辨率设置和窗口模式

第一种方法: 在项目配置Config文件夹下新建 DefaultGameUserSettings.ini 输入代码 [/Script/Engine.GameUserSettings] bUseVSyncFalse ResolutionSizeX1960 ResolutionSizeY1080 LastUserConfirmedResolutionSizeX800 LastUserConfirmedResolutionSizeY600 WindowPosX-1 …...

Java 线程中断 Interrupted

线程中断是 Java 中的一种协作机制&#xff0c;用于通知线程应该停止当前工作并退出。 中断就好比其它线程跟当前线程打了个招呼&#xff0c;告诉他可以执行中断操作。其他线程通过调用该线程的interrupt()方法对其进行中断操作。 中断并不会直接终止线程&#xff0c;而是设置…...

Android Jetpack是什么与原生android 有什么区别

Android Jetpack是什么 Android Jetpack是Google推出的一套开发组件工具集,旨在帮助开发者更高效地构建高质量的Android应用。它包含多个库和工具,被分为架构、用户界面、行为和基础四大类。以下是一些Android Jetpack的示例: 架构组件 ViewModel:用于以生命周期的方式管理…...

从0~1写一个starer启动器

从0到1编写一个Spring Boot Starter 前言 使用过Spring框架的伙伴都知道&#xff0c;虽然Spring在一定程度上帮助我们简化了集成其他框架&#xff0c;但在集成框架的同时仍少不了大量的XML配置&#xff0c;这些繁琐的工作无疑会加重我们的工作任务。而Spring Boot相较于Sprin…...

prime-2 靶场笔记(vuInhub靶场)

前言&#xff1a; 在本次靶场环境中涉及的知识点&#xff0c;主要包含LFI和SMB以及Lxd组提权&#xff0c;具体内容包括主机探测、端口扫描、目录扫描、wpscan扫描、反弹shell、一句话木马、容器、linux各种提权和维持。 环境介绍&#xff1a; 本靶场使用了kali&#xff08;192…...

Node.js 中的 Buffer(缓冲区)

下面是关于 Node.js 中的 Buffer&#xff08;缓冲区&#xff09; 的系统总结&#xff0c;涵盖了定义、创建、读取修改、溢出处理、中文编码问题以及字符串转换等关键用法&#x1f447; &#x1f9f1; 一、什么是 Buffer&#xff1f; Buffer 是 Node.js 提供的用于处理二进制数…...

如何学习嵌入式

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.16 请各位前辈能否给我提点建议&#xff0c;或者学习路线指导一下 STM32单片机学习总…...

高版本Android (AIDL HAL) 使用HIDL方法

目录 修改步骤和编译方法 注意事项 Android 11 引入了使用 AIDL 实现 HAL 的功能。 后续Android新版本,HAL默认切到了使用AIDL. 因此当导入旧HIDL实现方式时,需要做一些修改。 1.将HAL HIDL模块拷贝到相应目录,进行编译 source build/envsetup.sh lunch xxx mmm 模块路径 1.…...

Cribl (实验) vpc-flow 数据抽样

先看文档: Firewall Logs: VPC Flow Logs, Cisco ASA, Etc. | Cribl Docs Firewall Logs: VPC Flow Logs, Cisco ASA, Etc. Recipe for Sampling Firewall Logs Firewall logs are another source of important operational (and security) data. Typical examples include Ama…...

RK3568 更换显示logo

文章目录 1、环境介绍2、替换logo 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x sdk 屏幕&#xff1a;1024*600 hdmi屏 2、替换logo 这是一件提无语的事。本来替换logo是很平常的一件事。即替换kernel目录下的logo图片即可&#xff1a; 但…...

修改wsl中发行版Ubuntu的主机名

我wsl2中装了两个ubuntu的发行版本&#xff0c;默认下主机名和我的windows主机名都一样&#xff0c;而且包含大写字母&#xff0c;在配置其他应用时经常会出问题&#xff0c;按照下面的顺序修改了一下&#xff1a; 1、打开ubuntu发行版 现在显示包含大写字母和数字的主机名。 …...

Python学习之路(三)

将 Python 与数据库对接是开发过程中常见的任务&#xff0c;可以使用多种数据库&#xff08;如 SQLite、MySQL、PostgreSQL、Oracle、MongoDB 等&#xff09;。以下是一些常见的数据库及其与 Python 的对接方法&#xff0c;包括安装库、连接数据库、执行查询和操作数据的示例。…...

多功能门禁系统的设计

本课题为多功能门禁系统的设计&#xff0c;其系统架构如图2.1所示&#xff0c;整个系统由STM32F103单片机和MaixBit开发板两部分构成&#xff0c;其中MaixBit是基于K210芯片的开发板&#xff0c;在此主要负责人脸的录入&#xff0c;识别&#xff0c;液晶显示等功能&#xff0c;…...

C/C++---头文件保护机制

在 C 和 C 编程里&#xff0c;头文件保护机制是一种防止头文件被重复包含的技术&#xff0c;它主要借助 #ifndef、#define 和 #endif 这些预处理指令来达成&#xff0c;也可以使用 #pragma once 这一编译器特定指令。下面详细阐述这一机制&#xff1a; 1. 头文件重复包含的问题…...

双指针算法(一)

目录 一、力扣——283、移动零 二、力扣——1089、复写零 三、力扣——11、盛最多的水 四、力扣——202、快乐数 一、力扣——283、移动零 题目如下&#xff1a; 这里我们用双指针算法&#xff0c;用的是双指针的思想&#xff0c;我们在这道题在数组下操作可以用数组下标。…...

LNMP架构部署论坛

目录 1.安装Nginx服务 1.系统初始化​ 2.安装工具包及依赖包 3.创建运行用户​ 4.编译安装​ 5.优化路径​ 6.添加 Nginx 系统服 2.安装MySQL服务 1.确定GLIBC版本 2.上传二进制压缩包并解压​ 3. 创建运行用户​ 4. 创建 mysql 配置文件 5.更改mysql安装目录和配…...

微信小程序边框容器带三角指向

效果图 .wxml <view class"tb"><view class"tb-pointer" style"--n:{{n}}rpx;" /> </view> <button bind:tap"addPixel">增加三角一个像素</button>.js Page({data: {n:16,},addPixel(){this.setData…...

RISCV Hardware Performance Monitor 和 Sscofpmf 扩展

文章目录 前言RISCV的HPMSscofpmf 扩展总结 前言 Perf 全名是 Performance Event&#xff0c;应用可以利用 PMU (Performance Monitoring Unit)、tracepoint 和核心内部的特殊计数器&#xff08;counter&#xff09;来进行统计&#xff0c;另外还能同时分析运行中的核心代码&a…...

MATLAB脚本实现了一个三自由度的通用航空运载器(CAV-H)的轨迹仿真,主要用于模拟升力体在不同飞行阶段(初始滑翔段、滑翔段、下压段)的运动轨迹

%升力体:通用航空运载器CAV-H %读取数据1 升力系数 alpha = [10 15 20]; Ma = [3.5 5 8 10 15 20 23]; alpha1 = 10:0.1:20; Ma1 = 3.5:0.1:23; [Ma1, alpha1] = meshgrid(Ma1, alpha1); CL = readmatrix(simulation.xlsx, Sheet, Sheet1, Range, B2:H4); CL1 = interp2(…...

GIS开发笔记(4)结合osg及osgEarth实现地图选点功能

一、实现效果:在地球上点击某个点后,显示该点的坐标。 二、实现原理: viewer添加事件处理器类,类中响应鼠标左键事件,获取坐标点显示。 三、参考代码: #pragma once#include <osgGA/GUIEventHandler> #include...

halcon模板匹配(五)find_shape_model_clutter

目录 一、find_shape_model_clutter例程目的二、默认模板匹配的过程三、定义杂波区域四、设置模型的杂波区域 一、find_shape_model_clutter例程目的 如下图所示&#xff0c;这个例程是想找到左图所示区域内的目标&#xff0c;要求上下临近区域无目标。 默认参数匹配结果 二…...

openGauss使用指南与SQL转换注意事项

openGauss 使用指南与SQL转换注意事项 基本说明 openGauss数据库内核基于PostgreSQL(pgsql)&#xff0c;因此可以将SQL Server语句转换为pgsql语句。可以使用AI工具辅助转换&#xff0c;但需注意以下关键差异点。 数据类型转换注意事项 字符串类型处理 nvarchar转换&#…...

前端基础之《Vue(5)—组件基础》

一、什么是组件化 1、理解组件化 组件是HTML的扩展&#xff0c;使用粒度较小的HTML元素封装成粒度更大的标签&#xff08;Vue组件&#xff09;。可以实现快速开发、代码复用、提升可维护性。 相当于盖房子&#xff0c;用预制板&#xff0c;不是用一块块砖&#xff0c;一天可以…...

责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。在这个模式中,多个处理者对象会形成一个链条,每个处理者都有机会处理请求,或者将请求传递给链条中的下一个处理者。这种模式将…...

C++算法(9):数组作为函数参数,注意事项与实践

C编程中&#xff0c;数组作为函数参数传递是一个常见但容易出错的操作。本文将详细介绍数组作为函数参数时需要注意的关键问题&#xff0c;帮助开发者避免常见的陷阱。 主要注意事项 1. 数组作为参数的本质 参数声明形式实际传递内容大小信息int arr[]数组首地址丢失int arr[…...

特性(Attribute)

特性&#xff08;Attribute&#xff09;的概念 定义 特性是用于向代码元素&#xff08;类、方法、属性等&#xff09;添加元数据的类&#xff0c;继承自 System.Attribute。 元数据提供程序化的描述信息&#xff0c;供运行时或工具&#xff08;如编译器、反射&#xff09;使…...

使用CubeMX新建SysTick延时函数工程——使用中断,不使用HAL_Delay

具体操作步骤看这里&#xff1a;STM32CubeMX学习笔记&#xff08;4&#xff09;——系统延时使用_cubemx systick-CSDN博客 1、SysTick 初始化函数 SysTick 初始化函数由用户编写&#xff0c;里面调用了 SysTick_Config() 这个固件库函数&#xff0c;通过设置该固件 库函数的形…...

从零开始实现 MobileViT 注意力机制——轻量级Transformer Vision Model 的新思路

从零开始实现 MobileViT 注意力机制——轻量级Transformer Vision Model 的新思路 近年来&#xff0c;计算机视觉领域中 Transformer 模型的崛起为图像处理带来了新的活力。特别是在 ViT&#xff08;Vision Transformer&#xff09;模型提出之后&#xff0c;Transformer 在图像…...

Doris部署生产集群最低要求的部署方案

Doris生产集群最低部署方案&#xff08;2025年4月版&#xff09; 一、节点规划与数量 1. FE节点&#xff08;Frontend&#xff09; 数量&#xff1a;至少 3个节点&#xff08;1个Follower 2个 Observer&#xff09;&#xff0c;确保高可用&#xff08;HA&#xff09;。角色分…...

如何实现“一机两用” 寻求安全与效率的完美平衡

#### 一机两用的背景 在数字化时代&#xff0c;无论是企业还是政府部门&#xff0c;都面临着既要处理内部敏感数据&#xff0c;又要访问互联网获取资源的双重需求。这种需求催生了“一机两用”的模式&#xff0c;即同一台终端设备既要连接内网处理核心业务&#xff0c;又要能够…...

楼宇自控系统如何为现代建筑打造安全、舒适、节能方案

在科技飞速发展的当下&#xff0c;现代建筑对功能和品质的要求日益提升。楼宇自控系统作为建筑智能化的核心技术&#xff0c;宛如一位智慧的“管家”&#xff0c;凭借先进的技术手段&#xff0c;为现代建筑精心打造安全、舒适、节能的全方位解决方案&#xff0c;让建筑真正成为…...

Xilinx 7系列fpga在线升级和跳转

一、常见跳转方式 1&#xff0c;一般FPGA只要上电&#xff0c;就会自动从外部flash的0地址加载程序。 2&#xff0c;而我们所谓的在线式升级就是在flash0地址放一个程序&#xff08;boot/golden image&#xff09;&#xff0c;然后在后面再放一个程序&#xff08;app/update …...

【LangChain核心组件】Callbacks机制深度剖析与实战指南

目录 一、通俗解释&#xff08;举个&#x1f330;&#xff09; 二、具体能干啥&#xff1f; 三、怎么用&#xff1f;&#xff08;一句话说透&#xff09; 四、小结 五、为什么Callbacks是LangChain的灵魂组件&#xff1f; 六、Callbacks核心API解析 1、 基础回调处理器 …...

回调函数用法详细讲解

目录 一、通过几个例子&#xff0c;浅谈一下我的学习见解&#xff01; 二、typedef关键字用法回顾 1&#xff09;基本语法 2&#xff09;主要用途 1、为基本数据类型定义别名 2、为复杂类型定义别名 >>1.数组类型 >>2.指针类型 >>3.结构体类型 >…...

Nature子刊:科学家绘制与全身性癫痫发作相关的大脑网络图谱,为新的脑刺激疗法铺平道路

癫痫是一种古老的神经系统疾病&#xff0c;其历史可以追溯到数千年前。在古代&#xff0c;癫痫患者常被误解为受到神灵的惩罚或灵魂的附体&#xff0c;这种误解导致患者在社会中遭受歧视和排斥。然而&#xff0c;随着现代医学的发展&#xff0c;我们逐渐揭开了癫痫的神秘面纱&a…...

postman使用技巧

postman使用技巧 pre-request需求&#xff1a;三方对接的接口需要在请求头中添加如下参数pre-request 中获取环境变量中的变量值pre-request 中添加请求头 参考&#xff1a; pre-request 需求&#xff1a;三方对接的接口需要在请求头中添加如下参数 Accept: application/json…...

代码随想录算法训练营第十九天

LeetCode题目: 77. 组合216. 组合总和 III17. 电话号码的字母组合2537. 统计好子数组的数目(每日一题)516. 最长回文子序列1039. 多边形三角剖分的最低得分543. 二叉树的直径124. 二叉树中的最大路径和2246. 相邻字符不同的最长路径 其他: 今日总结 往期打卡 77. 组合 跳转: 7…...

MySQL联表查询底层原理

MySQL联表查询底层原理 1. 连接算法概述 MySQL在执行联表查询时&#xff0c;主要使用以下三种算法&#xff1a; 1.1 嵌套循环连接&#xff08;Nested-Loop Join&#xff09; -- 基本原理&#xff1a;对于左表的每一行&#xff0c;都要在右表中查找所有匹配的行 -- 示例查询…...

静态链接part2

编译 语义分析 由语义分析器完成&#xff0c;这个步骤只是完成了对表达式的语法层面的分析&#xff0c;它并不了解这个语句是否真的有意义&#xff08;例如在C语言中两个指针做乘法运算&#xff0c;这个语句在语法上是合法的&#xff0c;但是没有什么意义&#xff1b;还有同样…...

在边缘端进行tensorflow模型的部署(小白初探)

1.配置tensorflow的环境 &#xff08;我是安装GPU版本的&#xff09; 建议参考这个博主的文章&#xff0c;确实非常快速&#xff01; 十分钟安装Tensorflow-gpu2.6.0本机CUDA12 以及numpymatplotlib各包版本协调问题_tensorflow cuda12-CSDN博客 2.学习自制数据集 &#xf…...

合成数据如何赋能大模型预训练:效果与效率的双重加速器

目录 合成数据如何赋能大模型预训练&#xff1a;效果与效率的双重加速器 一、预训练模型为何需要合成数据&#xff1f; ✅ 克服真实数据的稀缺与偏倚 ✅ 控制训练内容结构与分布 ✅ 提升学习效率与训练稳定性 二、哪些预训练任务适合用合成数据&#xff1f; 三、如何构建…...

【n8n docker 部署的代理问题】解决n8n部署无法访问openai等外国大模型厂商的api

n8n docker 部署的代理问题&#xff1a;解决无法访问 OpenAI 等外国大模型厂商的 API 问题背景 在使用 n8n 进行自动化工作流开发时&#xff0c;经常需要调用 OpenAI 等外国大模型厂商的 API。然而&#xff0c;由于网络限制&#xff0c;直接部署的 n8n 容器无法访问这些 API …...

MongoDB 分账号限制数据访问

MongoDB 分账号限制数据访问 在 MongoDB 中&#xff0c;可以通过几种方式实现不同账号只能访问特定数据的需求&#xff0c;类似于你在 PostgreSQL 中实现的功能。 1. 基于角色的访问控制 (RBAC) 创建用户并分配角色 // 创建只能读取特定数据库的用户 use admin db.createUs…...

可控硅的工作原理和设计参考

可控硅物理结构如下图所示&#xff0c;P-N-P-N&#xff0c;就象两只背靠背的三极管。我们先来分析栅极不作电气联接的情况。当可控硅阴极电位大于阳极电位&#xff0c;J1和J3结反偏&#xff0c;器件截止。当可控硅阴极电位小于阳极电位&#xff0c;J1和J3正偏&#xff0c;但J2反…...

搭建axure cloud私有化平台

要求 https://blog.csdn.net/ss810540895/article/details/145833470 能不能找个空闲服务器&#xff0c;搭建一下 axure服务器&#xff0c;之前他们提供的免费服务终止了&#xff0c;我们需要尽快搭建一下服务。 步骤 mysql 数据库密码 Tbit36987. 分配权限 CREATE USER root…...

【无标题】spark SQL核心编程

MySQL Spark SQL 可以通过 JDBC 从关系型数据库中读取数据的方式创建 DataFrame&#xff0c;通过对 DataFrame 一系列的计算后&#xff0c;还可以将数据再写回关系型数据库中。 IDEA通过JDBC对MySQL进行操作&#xff1a; 1&#xff09; 导入依赖 <dependency> &l…...