Android:随笔——新的 NDK/JNI 调用方式

简介: 转载请标明地址 QuincySx: http://www.jianshu.com/p/c6108131ba0f众所周知现在 Android 开发已经到了 Android Studio 的时代,那么 JNI 的调用方式也经过了好几代在eclipse 时代就存在的 ndk-build 方式使用 Google 官方的 com.

转载请标明地址 QuincySx: http://www.jianshu.com/p/c6108131ba0f

众所周知现在 Android 开发已经到了 Android Studio 的时代,那么 JNI 的调用方式也经过了好几代

  1. 在eclipse 时代就存在的 ndk-build 方式
  1. 使用 Google 官方的 com.android.tools.build:gradle-experimental 简书地址
  2. CMake 方式,支持断点调试,这也是今天要说的是一种方式

使用 CMake 这种方式有几个条件

  1. Android Studio 2.2 或更高版本
  1. Android Plugin for Gradle 版本 2.2.0 或更高版本

好了下面需要下点必要工具 下载 NDK 和构建工具 要为您的应用编译和调试原生代码,您需要以下组件:
Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。
CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

img_b2f606fa5fa7d37fe78a8d659e34ac4f.png
Paste_Image.png

如图显示的三个 就是需要下载的三个

使用 CMake 有两种方式

  1. 第一种方式 是在项目创建的时候
  1. 第二种是在现有项目上添加

第一种方式

我们先介绍第一种方式 : 是建立新项目的时候

img_bd233bcbf82ae87bcd942bcc14f77502.png
创建项目

复选 include C++ support 然后和正常项目一样一直 Next 下一步

img_e1df46acad036628d8286df80b7ea225.png
配置项目
  • C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
  • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
  • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

根据自己情况选取 饭后点击 Finish

在这种情况下 如果没有安装 CMake Android Studio 会提示安装

img_cbf14a8c5d8433312b57381ea801798e.png

这是项目结构


img_44de81163bc1d8215f226b88c5357134.png
项目结构

第二种方式

第二种方式是 : 在原有想的基础上添加

这种方式有三个步骤

  • 创建新的原生源文件并将其添加到您的 Android Studio 项目中。如果您已经拥有原生代码或想要导入预构建的原生库,则可以跳过此步骤。
  • 创建 CMake 构建脚本将您的原生源代码构建到库中。如果导入和关联预构建库或平台库,您也需要此构建脚本。如果您的现有原生库已经拥有CMakeLists.txt构建脚本或者使用 ndk-build 并包含Android.mk构建脚本,则可以跳过此步骤。
  • 提供一个指向您的 CMake 或 ndk-build 脚本文件的路径,将 Gradle 关联到您的原生库。Gradle 使用构建脚本将源代码导入您的 Android Studio 项目并将原生库(SO 文件)打包到 APK 中。

首先在自己的模块下新建 JNI 目录

img_3bdc75be8946e9c6667950b627d51a47.png
Paste_Image.png

然后切换显示模式为 project 在 src > main 下会出现一个 jni 的目录 创建c文件 名字随意

img_da134f391e69b6d05d43ebef1d340785.png

然后在新建的文件夹下创建 C 的文件

img_36a95067a609f34e7a78d433b3e88c52.png

如果需要头文件 则需要勾选 Create an associated header

然后创建 CMakeLists.txt 文件 在模块根目录下创建(名字一定要是 CMakeLists.txt)

然后我们需要在文件中添加 cmake_minimum_required() 与 add_library() 两个方法

#指定 CMake 的最小版本
cmake_minimum_required(VERSION 3.4.1)

add_library( 
             #模块名 
             native

             #设置模块是可共享的
             SHARED

             #C 文件的具体路径 注意确认文件名后缀
             src/main/jni/native.cpp )

# 指定头文件路径 这里我没有创建 头文件先注释掉
# include_directories(src/main/jni/)

然后关联 CMake 与 Gradle

自动的方式
img_fa88e55cbb2fe5f13a171d7d143c00ea.png
Paste_Image.png
img_5193bf73bbaa48d5e1596fd54fba65ec.png

选择我们创建的 CMakeLists.txt 文件 点击完成等待

手动方式
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"
    }
  }
}

然后在 JAVA 中调用

在 Java 代码中 调用的时候 添加 这里的名字一定要和上面一致

static {
        System.loadLibrary("native");
    }

private native String getStr();

然后在书写一下 C 文件 (这里我创建的是 C++ 文件)

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_a21vianet_quincysx_demo_jnidemo_MainActivity_getStr(JNIEnv *env, jclass type) {
    char str[] = "我是C";
    return (*env).NewStringUTF(str);
}

总结

这只是最简单的一个 小例子,我水平不高也在学习,深入学习后会有更多的文章分享给大家

水平问题,难免会有错误,多谢各位指正

参考资料


目录
相关文章
|
5月前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
180 1
|
2月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
171 1
|
16天前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
83 1
|
2月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
149 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
2月前
|
开发工具 Android开发
解决Android Studio编译提示NDK is missing a “platforms“ directory
解决Android Studio编译提示NDK is missing a “platforms“ directory
154 1
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
130 4
|
5月前
|
Java Android开发
Android JNI 调用
Android JNI 调用
33 1
|
4月前
|
XML Java Android开发
Android Studio2.2 中支持NDK开发HelloJNI例子
Android Studio2.2 中支持NDK开发HelloJNI例子
31 0
|
5月前
|
Java 开发工具 Android开发
鸿蒙HarmonyOS 与 Android 的NDK有什么区别?
鸿蒙(HarmonyOS)和Android的NDK(Native Development Kit)是两个不同的概念,它们在设计理念、架构、开发方式和目标平台等方面存在着一些显著的不同。
245 0