吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5300|回复: 16
收起左侧

[Android 原创] jni开发------安装及配置 NDK 和 CMake

  [复制链接]
紫诺不离 发表于 2020-6-27 18:10

jni开发------安装及配置 NDK 和 CMake

论坛里面有很多jni开发的帖子,不过大多是一些ndk-build 构建工具包,而现在Android Studio默认的构建工具是CMake。

开发的代码并不是凭空产生的,我今天不仅告诉你们要怎么写,还要告诉你们为什么要那样写。首先放上google的NDK入门指南网址。

https://developer.android.com/ndk/guides

为什么要放上官方网址呢?

第一:每个人的理解是有差异的,经过周转可能会导致原意改变,造成后人理解错误

第二:官方的更全面

NDK安装

  1. 打开项目后,依次点击 Tools > SDK Manager

  2. 点击 SDK Tools 标签页。

  3. 选中 NDK (Side by side)CMake 复选框。
    android Emulator Hypervisor Driver for AMD Processors是android studio自带模拟器需要的(因为我的电脑cpu是amd的),不需要可以不下载。
    Documentation for Android SDK是离线版的开发文档,不需要可以不下载。

    ndk.png

  4. 点击 OK

  5. 此时系统会显示一个对话框,告诉您 NDK 软件包占用了多少磁盘空间。

  6. 点击 OK

  7. 安装完成后,点击 Finish

此处以在现有项目中添加jni为例。

第一步:创建新的c/c++源代码文件

  1. 如果您的应用的主源代码文件集内还没有 cpp/ 目录,请按如下所示的方法创建一个:

    1. 从 IDE 的左侧打开 Project 窗格,然后从下拉菜单中选择 Project 视图。
    2. 转到 your-module > src,右键点击 main 目录,然后依次选择 New > Directory
    3. 输入 cpp 作为目录名称,然后点击 OK
  2. 右键点击 cpp/ 目录,然后依次选择 New > C/C++ Source File

  3. 为您的源代码文件输入一个名称,例如 native-lib

  4. 从Type下拉菜单中,为您的源代码文件选择文件扩展名,例如

    .cpp
    • 您可以向此下拉菜单添加其他文件类型(例如 .cxx.hxx),只需点击 Edit File Types  即可。在弹出的 C/C++ 对话框中,从 Source ExtensionHeader Extension 下拉菜单中选择另一个文件扩展名,然后点击 OK
  5. 如果您还想要创建头文件,请选中 Create an associated header 复选框。

  6. 点击 OK

第二步:配置CMake

创建CMake构建脚本
  1. 从 IDE 的左侧打开 Project 窗格,然后从下拉菜单中选择 Project 视图。

  2. 右键点击your-module的根目录,然后依次选择New > File。

  3. 输入“CMakeLists.txt”作为文件名,然后点击 OK

    建立的各个文件路径

    建立的各个文件路径

    现在,您可以通过添加 CMake 命令来配置您的构建脚本。要指示 CMake 根据原生源代码创建原生库,请向您的构建脚本添加 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 )

    在使用 add_library() 向 CMake 构建脚本添加源代码文件或库时,Android Studio 还会在您同步项目后在 Project 视图中显示相关的头文件。不过,为了让 CMake 能够在编译时找到头文件,您需要向 CMake 构建脚本添加 include_directories() 命令,并指定头文件的路径:

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

    向 CMake 构建脚本添加 find_library()命令以找到 NDK 库并将其路径存储为一个变量。您可以使用此变量在构建脚本的其他部分引用 NDK 库。并会将其路径存储在 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 )

    为了让您的原生库能够调用 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} )

    关联Gradle

    1. 从 IDE 左侧打开 Project 窗格,然后选择 Android 视图。

    2. 右键点击您想要关联到原生库的模块(例如 app 模块),然后从菜单中选择 Link C++ Project with Gradle。您会看到一个类似于图 4 所示的对话框。

    3. 从下拉菜单中,选择CMake或ndk-build。

      a、如果您选择 CMake,请使用 Project Path 旁的字段为您的外部 CMake 项目指定 CMakeLists.txt 脚本文件。

      b、如果您选择 ndk-build,请使用 Project Path 旁的字段为您的外部 ndk-build 项目指定 Android.mk脚本文件。如果 Application.mk 文件与您的 Android.mk 文件位于同一目录下,Android Studio 也会包含此文件。

    使用 Android Studio 对话框关联外部 C++ 项目。

    4.点击 OK


添加到Gradle

添加到Gradle

选择的路径

选择的路径

关联Gradle后

关联Gradle后

此时就可以正常的写c层代码了,下篇文章讲解jni静态注册和动态注册。
      

      

   

免费评分

参与人数 4吾爱币 +10 热心值 +3 收起 理由
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
blindcat + 1 + 1 谢谢@Thanks!
杜蕾斯式Coding + 1 高手在吾爱。除了写代码,他们都还喜欢研究。
xiao14116 + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Poison_MY 发表于 2022-3-13 22:24
您好,请问一下编译时间特别长,请问有没有类似这种多线程编译的代码,这个只能用在ndk_build上cmake使用不了
[Java] 纯文本查看 复制代码
ndkBuild {
   arguments "-j${Runtime.runtime.availableProcessors()}"
}
 楼主| 紫诺不离 发表于 2020-8-21 10:56
迈克尔詹姆斯 发表于 2020-8-20 21:56
首先,谢谢楼主分享。。
再次,能请教下楼主,有没有系统学习NDK和JNI的教程吗。。
不胜感激

网上在NDK和jni的视频教程都是少量的,我只有一点视频,其他就看谷歌的开发文档
zhaoxiaohua125 发表于 2020-6-28 08:00
blindcat 发表于 2020-6-28 22:11
感谢楼主分享
梦想的咸鱼 发表于 2020-6-29 06:21
感谢分享
余、CC 发表于 2020-6-29 09:56
为什么我的AndroidStudio上看不到有LLDB模块
 楼主| 紫诺不离 发表于 2020-6-29 10:32
余、CC 发表于 2020-6-29 09:56
为什么我的AndroidStudio上看不到有LLDB模块

你是安装版的吗?
durongze 发表于 2020-7-3 20:46
谢谢分享。
划重点: 记住 Link C++ Project with Gradle  这个选项。。。
Blovesea 发表于 2020-7-15 10:07
学习了,楼主,楼主的分享步骤很详细
迈克尔詹姆斯 发表于 2020-8-20 21:56
首先,谢谢楼主分享。。
再次,能请教下楼主,有没有系统学习NDK和JNI的教程吗。。
不胜感激
describe 发表于 2020-8-21 06:49
感谢分享,学习了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表