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静态注册和动态注册。
您好,请问一下编译时间特别长,请问有没有类似这种多线程编译的代码,这个只能用在ndk_build上cmake使用不了ndkBuild {
arguments "-j${Runtime.runtime.availableProcessors()}"
} 迈克尔詹姆斯 发表于 2020-8-20 21:56
首先,谢谢楼主分享。。
再次,能请教下楼主,有没有系统学习NDK和JNI的教程吗。。
不胜感激
网上在NDK和jni的视频教程都是少量的,我只有一点视频,其他就看谷歌的开发文档 吾爱论坛越来越强大了:lol 感谢楼主分享 感谢分享 为什么我的AndroidStudio上看不到有LLDB模块{:1_908:} 余、CC 发表于 2020-6-29 09:56
为什么我的AndroidStudio上看不到有LLDB模块
你是安装版的吗? 谢谢分享。
划重点: 记住 Link C++ Project with Gradle这个选项。。。:lol 学习了,楼主,楼主的分享步骤很详细 首先,谢谢楼主分享。。
再次,能请教下楼主,有没有系统学习NDK和JNI的教程吗。。
不胜感激 感谢分享,学习了。
页:
[1]
2