在 Android Studio 2.2 中愉快地使用 C/C++

2023-11-12

使用 Android studio,你可以将 C 和 C++ 代码编译成 native library,然后打包到你的 APK 中。你的 Java 代码可以通过 Java Native Interface(JNI)调用 native library 库中的方法。如果你想了解更多关于如何使用 JNI,请参阅 JNI tips for Android。

Android Studio 默认使用 CMake 编译原生库。由于已经有大量的代码使用了 ndk-build 来编译 native code,所以 Android Studio 同样也支持 ndk build。如果你想导入一个 ndk-build 库到你的 Android Studio 项目中,请参阅 link to your native library。然而,如果你创建了一个新的 native 库工程,你应该使用 CMake。

本篇文章将会说明如何使用 Android Studio 来创建、配置 Android 项目,以支持 native code,以及将其运行到你的 app 中。

注意:要在 Android Studio 中使用 CMake 或者 ndk-build,你需要使用 Android Studio 2.2 或更高的版本,同时需要配合使用 Android Plugin for Gradle 2.2.0 及以上的版本。

下载 NDK 和构建工具

要编译和调试本地代码(native code),你需要下面的组件:

  • The Android Native Development Kit (NDK) : 让你能在 Android 上面使用 C 和 C++ 代码的工具集。
  • `CMake `: 外部构建工具。如果你准备只使用 ndk-build 的话,可以不使用它。
  • LLDB : Android Studio 上面调试本地代码的工匠。

你可以使用 SDK Manager 来安装上述组件:

  1. 打开一个项目,从菜单栏中选择 Tools > Android > SDK Manager 。
  2. 点击 SDK Tools 选项卡。
  3. 勾选 LLDB,CMake 和 NDK 。如图一:

  1. 点击 Apply ,然后点击 OK 。
  2. 当安装完成后,点击 Finish ,然后点击 OK 。

创建支持 C/C++ 的新项目

创建一个支持 native code 的项目和创建普通的 Android studio 工程很像。但是有几点需要留意的地方:

  1. 在 Configure your new project 选项中,勾选 Include C++ Support 选项。
  2. 点击 Next,后面的流程和创建普通的 Android studio 工程一样。
  3. 在 Customize C++ Support 选项卡中。你有下面几种方式来自定义你的项目:

    • C++ Standard :点击下拉框,可以选择标准 C++,或者选择默认 CMake 设置的 Toolchain Default 选项。
    • Exceptions Support :如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags中添加 -fexcetions 标志。
    • Runtime Type Information Support :如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags中添加 -frtti 标志。
  4. 点击 “Finish”。

当 Android Studio 完成新项目创建后,打开 Project 面板,选择 Android 视图。Android Studio 会添加 cpp 和 External Build Files 文件夹。

  1. cpp 文件夹存放你所有 native code 的地方,包括源码,头文件,预编译项目等。对于新项目,Android Studio 创建了一个 C++ 模板文件: native-lib.cpp ,并且将该文件放到了你的 app 模块的 src/main/cpp/ 目录下。这份模板代码提供了一个简答的 C++ 函数: stringFromJNI() ,该函数返回一个字符串:”Hello from C++”。
  2. External Build Files 文件夹是存放 CMake 或 ndk-build 构建脚本的地方。有点类似于 build.gradle 文件告诉 Gradle 如何编译你的 APP 一样,CMake 和 ndk-build 也需要一个脚本来告知如何编译你的 native library。对于一个新的项目,Android Studio 创建了一个 CMake 脚本: CMakeLists.txt ,并且将其放到了你的 module 的根目录下。

编译运行示例 APP

当你点击 Run 按钮,Android Studio 会编译并启动一个 APP ,然后在 APP 中显示一段文字”Hello from C++”。从编译到运行示例 APP 的流程简单归纳如下:

  1. Gradle 调用外部构建脚本,也就是 CMakeLists.txt 。
  2. CMake 会根据构建脚本的指令去编译一个 C++ 源文件,也就是 native-lib.cpp,并将编译后的产物扔进共享对象库中,并将其命名为 libnative-lib.so ,然后 Gradle 将其打包到 APK 中。
  3. 在运行期间,APP 的 MainActivity 会调用 System.loadLibrary() 方法,加载 native library。而这个库的原生函数, stringFromJNI() ,就可以为 APP 所用了。
  4. MainActivity.onCreate() 方法会调用 stringFromJNI() ,然后返回 “Hello from C++”,并更新 TextView 的显示。

注意: Instant Run 并不兼容使用了 native code 的项目。Android Studio 会自动禁止 Instant Run 功能。

如果你想验证一下 Gradle 是否将 native library 打包进了 APK,你可以使用 APK Analyzer:

  1. 选择 Build > Analyze APK 。
  2. 从 app/build/outputs/apk/ 路径中选择 APK,并点击 OK 。
  3. 如下图,在 APK Analyzer 窗口中,选择 lib/<ABI>/ ,你就可以看见 libnative-lib.so 。

将 C/C++ 代码添加到现有的项目中

如果你想将 native code 添加到一个现有的项目中,请按照下面的步骤操作:

  1. 创建新的 native source 文件,并将其添加到你的 Android Studio 项目中。如果你已经有了 native code,也可以跳过这一步。
  2. 创建一个 CMake 构建脚本。如果你已经有了一个 CMakeLists.txt 构建脚本,或者你想使用 ndk-build 然后有一个 Android.mk 构建脚本,也可以跳过这一步。
  3. 将你的 native library 与 Gradle 关联起来。Gradle 使用构建脚本将源码导入到你的 Android Studio 项目中,并且将你的 native library (也就是 .so 文件)打包到 APK 中。

一旦你配置好了项目,你就可以在 Java 代码中,使用 JNI 框架开调用原生函数(native functions)。只需要点击 Run 按钮,就可以编译运行你的 APP 了。

创建新的 native source 文件

请按照下面的方法来创建一个 cpp/ 文件夹和源文件(native source files):

  1. 打开IDE左边的 Project 面板,选择 Project 视图。
  2. 找到你项目的 module > src 目录,右键点击 main 文件夹,选择 New > Directory 。
  3. 输入文件夹的名字(比如 cpp),然后点击 OK 。
  4. 右键点击刚才创建好的文件夹,选择 New > C/C++ Source File 。
  5. 输入文件名,比如 native-lib 。
  6. 在 Type 菜单下拉选项中,选择源文件的扩展后缀名,比如 .cpp 。
  7. 如果你也想创建一个头文件,点击 Create an associated header 选项框。
  8. 点击 OK 。

创建 CMake 构建脚本

如果没有一个 CMake 构建脚本,你需要自己手动创建一个,并添加一些合适的 CMake 命令。CMake 构建脚本是一个空白的文本文档(后缀为 .txt 的文件),名字必须为 CMakeLists.txt 。

注意:如果你的项目使用了 ndk-build,你就不需要创建 CMake 构建脚本,只需要提供一个路径链,将你的 Android.mk 文件链接到 Gradle 中即可。

将一个空白的文本文档变成一个 CMake 构建脚本,你需要这么做:

  1. 打开 IDE 左边的 Project 面板,选择 Project 视图。
  2. 在你的 module 根目录下,右键,选择 New > File 。
  3. 输入 “CMakeLists.txt” 作为文件名,并点击 OK 。

现在,你可以添加 CMake 命令来配置你的构建脚本了。为了让 CMake 将源代码(native source code)编译成 native library。需要在编译文件中添加 cmake_minimum_required() 和 add_library() 命令:

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             native-lib

            # Sets the library as a shared library.
             SHARED

            # Provides a relative path to your source file(s).
            src/main/cpp/native-lib.cpp )
of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             native-lib

            # Sets the library as a shared library.
             SHARED

            # Provides a relative path to your source file(s).
            src/main/cpp/native-lib.cpp )

当你使用 add_library() ,将一个源文件(source file)或库添加到你的 CMake 构建脚本,同步你的项目,然后你会发现 Android studio 将关联的头文件也显示了处理。然而,为了让 CMake 在编译时期能定位到你的头文件,你需要在 CMake 构建脚本中添加 include_directories() 命令,并指定头文件路径:

add_library(...)

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)
(...)

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)

然后,按照约定,CMake 会将生成的 library 命名为下面的形式:

lib*library-name*.so

比如,如果你在构建脚本中,将 library 命名为 “native-lib”,那么 CMake 会创建叫 libnative-lib.so 的文件。但是,当你将 library 加载到 Java 代码中的时候, 你需要使用在 CMake 中指定的名称:

static {
        System.loadLibrary(“native-lib”);
}
 {
        System.loadLibrary(“native-lib”);
}

注意:如果你将 CMake 脚本里面的 library 重命名了,或者移除了。你需要清理一下你的工程。在 IDE 的菜单栏中选择 Build > Clean Project 。

Android Studio 会在 Project 面板中的 cpp 文件夹中自动添加源文件和头文件。你可以多次使用 add_library() 命令,来添加额外的 library。

添加 NDK APIs

Android NDK 提供了一些有用的 native APIs。将 NDK librarys 添加到 CMakeLists.txt 脚本文件中,就可以使用这些 API 了。

预编译的 NDK librarys 已经存在在 Android 平台中了,所以你不需要编译它们,或者是将其打包到你的 APK 中。因为这些 NDK librarys 已经是 CMake 搜索路径的一部分,你甚至不需要提供你本地安装的 NDK 路径。你只需要向 CMake 提供你想使用的 library 名字。

将 find_library() 命令添加到你的 CMake 构建脚本中,这样就可以定位 NDK library 的位置,并将其位置存储在一个变量之中。你可以在构建脚本的其他地方使用这个变量,来代指 NDK library。下面的示例代码将 Android-specific log support library 的位置存储到变量 log-lib 中:

find_library( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

              # Specifies the name of the NDK library that
              # CMake needs to locate.
              log )
( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

              # Specifies the name of the NDK library that
              # CMake needs to locate.
              log )

NDK 同样也包含一些只包含源码的 library,这些就需要你去编译,然后链接到你的本地库(native library)。你可以在 CMake 构建脚本中使用 add_library() 命令将源码编译进本地库。这时就需要提供你的本地 NDK 安装路径,通常将该路径保存在 ANDROID_NDK 变量中,这样 Android Studio 可以自动为你识别。

下面的命令告诉 CMake 去构建 android_native_app_glue.c ,这个命令可以管理 NativeActivity 的生命周期以及点击输入,并将其导入静态库中,然后将其链接至 native-lib :

add_library( app-glue
             STATIC
             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )
STATIC
             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )

添加其他的预编译库

添加预编译库和添加本地库(native library)类似。由于预编译库是已经构建好的,你想就要使用 IMPORTED 标志去告诉 CMake ,你只需要将其导入到你的项目中即可:

add_library( imported-lib
             SHARED
             IMPORTED )
imported-lib
             SHARED
             IMPORTED )

然后你需要使用 set_target_properties() 命令去指定库的路径,就像下面的代码那样。

一些库会根据不同的 CPU 使用不同的包,或者是 Application Binary Interfaces(ABI) ,并且将他们归类到不同的目录中。这样做的好处是,可以充分发挥特定的 CPU 架构。你可以使用 ANDROID_ABI 路径变量,将多个 ABI 版本的库添加到你的 CMake 构建脚本中。这个变量使用了一些 NDK 默认支持的 ABI,以及一些需要手动配置到 Gradle 的 ABI,比如:

add_library(...)
set_target_properties( # Specifies the target library.
                       imported-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
(...)
set_target_properties( # Specifies the target library.
                       imported-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )

为了让 CMake 在编译时期能找到你的头文件,你需要使用 include_directories() 命令,并且将你的头文件地址传进去:

include_directories( imported-lib/include/ )
( imported-lib/include/ )

在 CMake 构建脚本中使用 target_link_libraries() 命令,将预构建库与你本地库相关联:

target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
( native-lib imported-lib app-glue ${log-lib} )

当你构建你的 APP 的时候,Gradle 会自动将导入的库打包到你的 APK 中。你可以使用 APK Analyzer 来检查。

关联本地库与 Gradle

为了将本地库与 Gradle 相关联,你需要在 CMake 或 ndk-build 构建脚本中提供一个路径地址。当你构建你的 APP 时,Gradle 会将 CMake 或 ndk-build 作为一个依赖运行,然后将共享库(.so 文件)打包到你的 APK 中。Gradle 同样使用构建脚本来识别哪些文件需要导入到 Android Studio 项目,你可以从 Project 窗口面板中看到相应的文件。如果你还没有一个为 native sources 准备的构建脚本,你需要先创建一个。

使用 Android Studio 图形化界面

你可以使用 Android Studio 的图形化界面来将 Gradle 与外部 CMake 或者 ndk-build 项目关联起来。

  1. 打开 IDE 左边的 Project 面板,选择 Android 视图。
  2. 右键点击你想链接本地库的 module,比如 app module,然后从菜单中选择 Link C++ Project with Gradle 。你应该能看见一个和下图很像的对话框。
  3. 在下拉菜单中,选择 CMake 或者 ndk-build 。

    a. 如果你选择 CMake ,需要在 Project Path 中指定 CMakeLists.txt 脚本文件的路径。

    b. 如果你选择 ndk-build ,你需要在 Project Path 中指定 Android.mk 脚本文件的路径。

  4. 点击 OK。

手动配置 Gradle

如果要手动将 Gradle 与你的本地库相关联,你需要在 module 层级的 build.gradle 文件中添加 externalNativeBuild {} 代码块,并且在该代码块中配置 cmake {}或 ndkBuild {} :

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}
"CMakeLists.txt"
    }
  }
}

可选配置

你可以在你的 module 层级的 build.gradle 文件中的 defaultConfig {} 代码块中,添加 externalNativeBuild {} 代码块,为 CMake 或 ndk-build 配置一些额外参数。当然,你也可以在你的构建配置中的其他每一个生产渠道重写这些属性。

比如,如果你的 CMake 或者 ndk-build 项目中定义了多个本地库,你想在某个生产渠道使用这些本地库中的几个,你就可以使用 targets 属性来构建和打包。下面的代码展示了一些你可能会用到的属性:

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use ndkBuild {}
      cmake {

        // Passes optional arguments to CMake.
        arguments "-DCMAKE_VERBOSE_MAKEFILE=TRUE"

        // Sets optional flags for the C compiler.
        cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"

        // Sets a flag to enable format macro constants for the C++ compiler.
        cppFlags "-D__STDC_FORMAT_MACROS"
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    demo {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries to build and package for this
          // product flavor. If you don't configure this property, Gradle
          // builds and packages all shared object libraries that you define
          // in your CMake or ndk-build project.
          targets "native-lib-demo"
        }
      }
    }

    paid {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets "native-lib-paid"
        }
      }
    }
  }

  // You use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}


----------
is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use ndkBuild {}
      cmake {

        // Passes optional arguments to CMake.
        arguments "-DCMAKE_VERBOSE_MAKEFILE=TRUE"

        // Sets optional flags for the C compiler.
        cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"

        // Sets a flag to enable format macro constants for the C++ compiler.
        cppFlags "-D__STDC_FORMAT_MACROS"
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    demo {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries to build and package for this
          // product flavor. If you don't configure this property, Gradle
          // builds and packages all shared object libraries that you define
          // in your CMake or ndk-build project.
          targets "native-lib-demo"
        }
      }
    }

    paid {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets "native-lib-paid"
        }
      }
    }
  }

  // You use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}


----------

指定 ABI

一般情况下,Gradle 会将你的本地库构建成 .so 文件,然后将其打包到你的 APK 中。如果你想 Gradle 构建并打包某个特定的 ABI 。你可以在你的 module 层级的 build.gradle 文件中使用 ndk.abiFilters 标签来指定他们:

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your APK.
      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}
'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

大多数情况,你只需要像上面的代码那样,在 ndk {} 代码块中指定 abiFilters即可。如果你想控制 Gradle 构建、依赖你希望的东西,你就需要在 defaultConfig.externalNativeBuild.cmake {} 代码块或 defaultConfig.externalNativeBuild.ndkBuild {} 代码块中,配置其他的 abiFilters 标签。Gradle 会构建这些 ABI 配置,但是只会将 defaultConfig.ndk {} 代码块中指定的东西打包到 APk 中。

原文:http://wl9739.github.io/2016/09/21/%E5%9C%A8-Android-Studio-2-2-%E4%B8%AD%E6%84%89%E5%BF%AB%E5%9C%B0%E4%BD%BF%E7%94%A8-C-C-md/?utm_source=tuicool&utm_medium=referral

 【关于我们】

才淇(微信公众号:caiqicehua),专注于国内各大互联网公司社会招聘内推。每天更新最新互联网名企(包括但不限于今日头条、网易游戏、BAT、网易互联网、小米、京东、乐视、携程等名企)内推信息,有技术岗、有产品岗、有运营岗、有设计岗、有交互岗、有销售岗,更有其他N多相关岗位!更多内推信息请扫描以下二维码关注查阅。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android Studio 2.2 中愉快地使用 C/C++ 的相关文章

随机推荐

  • 更多提高正则表达式效率的方法

    原文 http wyzws iteye com blog 1274020 让匹配更快失败 尤其是匹配很长的字符串时 匹配失败的位置要比成功的位置多得多 以简单 必须的字元开始 排除明显不匹配的位置 如锚点 或 特殊字符 x或 u263A 字
  • win32 消息循环

    windows系统把应用程序的输入事件传递给各个窗口 每个窗口有一个函数 称为窗口消息处理函数 窗口消息处理函数处理各种用户输入 处理完成后再将控制权交还给系统 窗口消息处理函数一般是在注册一个窗口的时候指定的 在Windows下 只有那些
  • linear-gradient为啥只能background不能background-color

    background 可以设置 背景颜色 背景图片 定位等 而background color 只能设置 背景颜色 设置background color aaa 此时仅仅改专变了背景色 但此时有一个默认的的background repeat
  • 什么是OAuth

    什么是OAuth OAuth 全称 Open Authorization 中文翻译开放授权 是一种基于令牌的身份验证 允许组织跨第三方服务共享信息 而无需公开用户的用户名 密码 本质上 OAuth是为第三方服务提供令牌的中间人 该令牌只允许
  • android按日期函数查询,Android开发中SQLite存储时间和按日期函数查询

    Android开发中SQLite存储时间和按日期函数查询 Android开发中SQLite存储时间和按日期函数查询 在Android开发中 在消息模块中 消息做数据库缓存处理 排序查询或指定时间查询需要用时间和日期函数 本篇简括 存储时间字
  • QT 完美实现圆形按钮

    QT 版本 5 6 0 官方的按钮有些普通 如果我们想要换成自己喜欢的按钮而却无从下手 那么请继续往下阅读 皮一下 首先 可以在网络上搜索一下自己喜欢的按钮图形 或者可以自行绘制 我以下面的图形为例 开始制作 一 建立 QT 工程 并加入图
  • 基于画布canvas进行图片压缩

    Canvas 压缩图片的原理主要是通过重新绘制图片 调整图片质量或大小来达到压缩图片的目的 具体实现步骤如下 1 使用 JavaScript 中的 Image 对象将图片加载到内存中 var img new Image img src im
  • mkp勒索病毒怎么处理

    目录 前言 简介 一 mkp勒索病毒的特征 二 mkp后缀勒索病毒是如何传播的 三 如何预防与处理mkp勒索病毒攻击 前言 简介 当今 勒索病毒已成为企业网络安全的一大威胁 而其中mkp勒索病毒则是一种新近出现的变种 与其他勒索病毒一样 m
  • 关于redis密码

    如何更改密码 直接配置文件里更改 配置文件里开放 requirepass 之后客户端更改 用Redis命令查询密码 可以使用以下Redis命令来查询密码 config get requirepass 得到的结果第一行固定是requirepa
  • 设计模式-备忘录模式(Memento Pattern)

    文章目录 前言 一 备忘录模式的概念 二 备忘录模式的实现 三 备忘录优缺点 优点 缺点 总结 前言 备忘录模式 Memento Pattern 是一种行为型设计模式 它用于捕获和存储对象的内部状态 以便在以后可以恢复到先前的状态 备忘录模
  • pthread_detach函数

    int pthread detach pthread t thread 成功 0 失败 错误号 作用 从状态上实现线程分离 注意不是指该线程独自占用地址空间 线程分离状态 指定该状态 线程主动与主控线程断开关系 线程结束后 不会产生僵尸线程
  • jwt编码解码

    import jwt 创建 JWT payload user id 1234 secret key your secret key 密钥 用于签名和验证 algorithm HS256 签名算法 token jwt encode paylo
  • NPM导入模块报错

    npm WARN enoent ENOENT no such file or directory open C Program Files nodejs package json 找不到package json文件 一般情况下npm安装时都
  • python 删除文件、清空目录的方法总结

    Python os remove 方法 os remove 方法用于删除指定路径的文件 如果指定的路径是一个目录 将抛出OSError 在Unix Windows中有效 以下实例演示了 remove 方法的使用 usr bin python
  • python---面向对象(一)

    类和对象 面向对象编程的2个非常重要的概念 类和对象 对象是面向对象编程的核心 在使用对象的过程中 为了将具有共同特征和行为的一组对象抽象定义 提出了另外一个新的概念 类 类就相当于制造飞机时的图纸 用它来进行创建的飞机就相当于对象 类是抽
  • Visual Prompt

    始于NLP 简单来讲 Prompt就是对原来的输入文本进行一定的处理 使得在不改变预训练模型参数的情况下 相应任务的性能变高 例如 原输入文本为 I received the offer from ETH 对于文本分类 我们将其修改为I r
  • cassandra ssdb mongodb

    IM系统 数据量大了mongodb性能有瓶颈 cassandra ssdb 配合使用来搞IM 写扩散 其实是双写 历史消息走cassandra ssdb保留7天的离线消息 cassandra ssdb mongodb
  • 简单的解压缩算法(华为od考试)

    题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数字N 表示重复字符N次 例如 压缩内容为A3 表示原始字符串为AAA 2 花括号中的字符串加数字N 表示花括号中的字符重复N次 例如压缩内容为
  • 12面魔方公式图解法_【高级篇】(三)三阶魔方CFOP高级玩法之——F2L

    一 F2L这一步要干什么 1 先了解一下 棱角对 和 槽位 的概念 棱角对 即由一个棱块和一个角块构成 是F2L的基本单元 共四组 槽位 给 棱角对 预留的位置 即 棱角对 最后需要插入的地方 棱角对 和 槽位 的概念 2 棱角对 是如何插
  • 在 Android Studio 2.2 中愉快地使用 C/C++

    使用 Android studio 你可以将 C 和 C 代码编译成 native library 然后打包到你的 APK 中 你的 Java 代码可以通过 Java Native Interface JNI 调用 native libra