当前位置: 首页 > news >正文

2025年的Android NDK 快速开发入门

十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三:Android Studio的NDK开发》,今天看来已经发生了很多变化,NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。

**原生开发套件 (NDK) **是一套工具,使开发者能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库。官方默认使用CMake作为构建工具。

一、NDK 核心作用

  • 高性能计算:图像处理、物理仿真、音视频编解码
  • 复用现有库:OpenCV、FFmpeg、TensorFlow Lite
  • 底层硬件访问:传感器、GPU 指令集(如 NEON/VFP)
  • 安全敏感操作:加密算法、反调试逻辑

二、环境配置

1.工具链安装

  • Android Studio:SDK Manager → NDK (Side by side)
  • CMake:外部构建工具,可与 Gradle 搭配使用来构建原生库。
  • LLDB:Native 代码调试器(如果仅仅尝试NDK,可以暂且不用它)

三、实践开始:打通kotlin和Cpp端

新建项目自不必说。

新建kotlin文件

比如新建一个nativelib包,下面新建一个NativeTest.kt。编写两个方法如下:

package com.example.kotlinlearningproject.nativelib

class NativeTest {

    external fun add(one: Int, two: Int): Int

    // external fun addString(one: String): String

    companion object {
        init {
            System.loadLibrary("native-lib")
        }
    }
}

新建cpp文件

在src->main下新建cpp目录,并新建一个cpp文件叫native-lib.cpp。
对应按规则直接写Cpp对应的方法,如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <string.h>
/* Header for class com_example_kotlinlearningproject_nativelib_NativeTest */

#ifndef _Included_com_example_kotlinlearningproject_nativelib_NativeTest
#define _Included_com_example_kotlinlearningproject_nativelib_NativeTest
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_com_example_kotlinlearningproject_nativelib_NativeTest_add
        (JNIEnv *env, jobject obj, jint one, jint two){
    return one + two;
}

#ifdef __cplusplus
}
#endif
#endif

当然了,你可以用javah工具或者java -h 命令生成头文件,更安全。如果觉得自己不会犯低级错误,直接就着上面改,也没啥问题。

新建CMakeLists.txt

在app根目录下,新建CMake配置文件。内容如下:


cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets 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
             )


find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.
                        native-lib
                       # Links the target library to the log library
                       ${log-lib} )

Gradle 配置

app下的build.gradle新增如下内容:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=TRUE"
                cppFlags "-std=c++17 -frtti -fexceptions"
            }
        }
        ndk {
            abiFilters "arm64-v8a"
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

对应的,如果你是build.gradle.kt,那参考下面:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments += "-DANDROID_ARM_NEON=TRUE"
                cppFlags += listOf("-std=c++17", "-frtti", "-fexceptions")
            }
        }
        ndk {
            abiFilters += listOf("arm64-v8a")
        }
    }
    externalNativeBuild {
        cmake {
            path = file("CMakeLists.txt")
        }
    }
}

四、实践开始:新建activity调用上述接口

在Activity中新建一个按钮,btnNdk,点击调用上述接口:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.btnNdk.setOnClickListener { testNdk() }
    }

    private fun testNdk() {
        val test = NativeTest()
        val result = test.add(23,90)
        Toast.makeText(this, "调用NDK计算:${result}", Toast.LENGTH_SHORT).show()
    }

一切准备就绪了是吧,接下来只需要绿色的run按钮,剩下的都交给Android Studio吧!!!
现在真是做到了无缝衔接java/kotlin与C/C++,确实比十年前进步了一些。

参考官方文档

相关文章:

  • cgroups
  • SVMSPro分布式综合安防管理平台--地图赋能智慧指挥调度新高度
  • Linux 线程:从零构建多线程应用:系统化解析线程API与底层设计逻辑
  • 人物4_Japanese
  • ubuntu20.04+qt5.12.8安装serialbus
  • 【Pandas】pandas DataFrame iat
  • 蓝桥杯篇---客观题
  • 学习笔记五——Rust 控制流全解析
  • 【Pandas】pandas DataFrame at
  • Java对接智能客服:从0到1构建高并发对话系统的实战指南
  • UE5,LogPackageName黄字警报处理方法
  • 洛古B4158 [BCSP-X 2024 12 月小学高年级组] 质数补全(线性筛/dfs)
  • Jetson AGX Xavier开发套件使用方法
  • HCIE无线控制器配置常见问题及解决方法
  • 【C语言】--- 文件操作
  • IPD推进中关键角色与岗位(八)LPMT优化产品全生命周期管理,帮助企业在竞争
  • 基于 JavaWeb 的 SSM 在线视频教育系统设计和实现(源码+文档+部署讲解)
  • P10899 [蓝桥杯 2024 省 C] 劲舞团
  • 文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)
  • Windows系统备份和还原点
  • 使用云主机做网站教程/搜索引擎优化的基础是什么
  • 一个云主机怎么挂两个网站/搜索百度app下载
  • 帮别的公司做网站违法吗/学校seo推广培训班
  • 网站与网站自动跳转代码/百度建站
  • 如何能让企业做网站的打算/合肥网站推广公司排名
  • 艺术视频手机网站可以做吗/厦门关键词排名seo