JNI基础

作者: 小强开学前 | 来源:发表于2020-05-18 15:25 被阅读0次

    1. Android NDK( Native Development Kit )

    Android NDK 是一个工具集,可让您使用 C 和 C++ 等语言以原生代码实现应用的各个部分。对于特定类型的应用,这可以帮助您重复使用以这些语言编写的代码库。

    就是包含运行其他语言的工具。

    2. find_library

    Android 平台上已存在预构建的 NDK 库,因此您无需构建它们或将它们打包到 APK 中。由于这些 NDK 库已位于 CMake 搜索路径中,因此您甚至无需指定本地安装的 NDK 库的位置,您只需为 CMake 提供您想要使用的库的名称,并将其与您自己的原生库相关联即可。
    向 CMake 构建脚本添加 find_library() 命令以找到 NDK 库并将其路径存储为一个变量。您可以使用此变量在构建脚本的其他部分引用 NDK 库。以下示例可以找到 Android 专有的日志支持库,并会将其路径存储在 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 )
    

    就是直接把NDK内置的包拿来用,比如找到log包并且命名为log-lib

    3. add_library

    以源代码的形式包含一些库,您将需要构建这些代码并将其关联到您的原生库。您可以使用 CMake 构建脚本中的 add_library() 命令将源代码编译到原生库中。要提供本地 NDK 库的路径,您可以使用 Android Studio 自动为您定义的 ANDROID_NDK 路径变量。
    以下命令告诉 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} )
        
    

    4. IMPORTED

    添加预构建库的步骤与为 CMake 指定其他要构建的原生库的步骤相似。不过,由于库已构建,因此您需要使用 IMPORTED 标记告诉 CMake 您只想要将此库导入到您的项目中。

     add_library( imported-lib
                     SHARED
                     IMPORTED )
    

    5. set_target_properties

    然后,您需要使用 set_target_properties() 命令指定库的路径,具体步骤如下所示。
    某些库会针对特定的 CPU 架构或应用二进制接口 (ABI) 提供单独的软件包,并将其整理到单独的目录中。此方法既有助于库充分利用特定的 CPU 架构,又能让您只使用所需的库版本。要向 CMake 构建脚本添加库的多个 ABI 版本,而不必为库的每个版本编写多个命令,您可以使用 ANDROID_ABI 路径变量。此变量使用的是 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 )
        
    

    就是说如果你要包含的不是C代码(源文件),而是lib包,那么就要add后这么指定,否则就直接add源文件就行。

    6. target_link_libraries

    为了让您的原生库能够调用 log 库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联这些库:

       find_library(...)
    
        # Links your native library against one or more other native libraries.
        target_link_libraries( # Specifies the target library.
                               native-lib
    
                               # Links the log library to the target library.
                               ${log-lib} )
        
    

    就是之前add的和find的library都要在这里包含进去才能用,find的库需要根据名称添加${}取到地址。

    相关文章

      网友评论

          本文标题:JNI基础

          本文链接:https://www.haomeiwen.com/subject/ivgyohtx.html