紫诺不离 发表于 2020-6-27 18:10

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

# 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是离线版的开发文档,不需要可以不下载。



4. 点击 **OK**。

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

6. 点击 **OK**。

7. 安装完成后,点击 **Finish**。

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

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

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

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

3. 右键点击 `cpp/` 目录,然后依次选择 **New > C/C++ Source File**。

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

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

   ```
   .cpp
   ```

   - 您可以向此下拉菜单添加其他文件类型(例如 `.cxx` 或 `.hxx`),只需点击 **Edit File Types**即可。在弹出的 **C/C++** 对话框中,从 **Source Extension** 和 **Header Extension** 下拉菜单中选择另一个文件扩展名,然后点击 **OK**。

6. 如果您还想要创建头文件,请选中 **Create an associated header** 复选框。

7. 点击 **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**。



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

      

   

Poison_MY 发表于 2022-3-13 22:24

您好,请问一下编译时间特别长,请问有没有类似这种多线程编译的代码,这个只能用在ndk_build上cmake使用不了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

吾爱论坛越来越强大了:lol

blindcat 发表于 2020-6-28 22:11

感谢楼主分享

梦想的咸鱼 发表于 2020-6-29 06:21

感谢分享

余、CC 发表于 2020-6-29 09:56

为什么我的AndroidStudio上看不到有LLDB模块{:1_908:}

紫诺不离 发表于 2020-6-29 10:32

余、CC 发表于 2020-6-29 09:56
为什么我的AndroidStudio上看不到有LLDB模块

你是安装版的吗?

durongze 发表于 2020-7-3 20:46

谢谢分享。
划重点: 记住 Link C++ Project with Gradle这个选项。。。:lol

Blovesea 发表于 2020-7-15 10:07

学习了,楼主,楼主的分享步骤很详细

迈克尔詹姆斯 发表于 2020-8-20 21:56

首先,谢谢楼主分享。。
再次,能请教下楼主,有没有系统学习NDK和JNI的教程吗。。
不胜感激

describe 发表于 2020-8-21 06:49

感谢分享,学习了。
页: [1] 2
查看完整版本: jni开发------安装及配置 NDK 和 CMake