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.nativelibclass NativeTest {external fun add(one: Int, two: Int): Int// external fun addString(one: String): Stringcompanion 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" {
#endifJNIEXPORT 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++,確實比十年前進步了一些。

參考官方文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901083.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shell 編程之條件語句

目錄 條件測試操作 文件測試 整數值比較 字符串比較 邏輯測試 if 條件語句 if語句的結構 1、單分支 if 語句 2、雙分支 if 語句 3、多分支 if 語句 if語句應用實例 1、單分支 if 語句應用 2、雙分支 if 語句應用 3、多分支 if 語句應用 case 分支語句 case語句的結構 case語…

【模板】縮點

洛谷p3387 思路: 算法:tarjan算法 根據題意,我們只要找到一個路徑,使得最終權重最大即可,首先,根據題目可知,如果一個點在一個環上,那么我們就將這整個環都選上,題目上允許我們能夠重復走,因此,我們可以將環縮成點,將環所稱點后,就可以轉換成樹,從沒有父節點的結點開始,我們向…

js觸發隱式類型轉換的場景

JavaScript 的隱式類型轉換&#xff08;Implicit Type Coercion&#xff09;會在某些操作或上下文中自動觸發&#xff0c;將值從一種類型轉換為另一種類型。以下是常見的觸發場景&#xff1a; 1. 使用 &#xff08;寬松相等&#xff09;比較時 會嘗試將兩邊的值轉換為相同類型后…

c++將jpg轉換為灰度圖

c將jpg轉換為灰度圖 step1:添加依賴 下載這兩個文件&#xff0c;放在cpp同一目錄下&#xff0c;編譯生成 https://github.com/nothings/stb/blob/master/stb_image_write.h https://github.com/nothings/stb/blob/master/stb_image.hstep2:C:\Users\wangrusheng\source\repos…

python——正則表達式

一、簡介 在 Python 中&#xff0c;正則表達式主要通過 re 模塊實現&#xff0c;用于字符串的匹配、查找、替換等操作。 二、Python的re模塊 使用前需要導入&#xff1a; import re 三、常用方法 方法描述re.match(pattern, string)從字符串開頭匹配&#xff0c;返回第一個匹…

Soybean Admin 配置vite兼容低版本瀏覽器、安卓電視瀏覽器(飛視瀏覽器)

環境 window10 pnpm 8.15.4 node 8.15.4 vite 5.1.4 soybean admin: 1.0.0 native-ui: 2.38.0 小米電視 MIUI TV版本&#xff1a;MiTV OS 2.7.1886(穩定版) 飛視瀏覽器&#xff1a;https://www.fenxm.com/1220.html在小米電視安裝飛視瀏覽器可以去小紅書查安裝教程&#xff1a…

系統與網絡安全------網絡通信原理(1)

資料整理于網絡資料、書本資料、AI&#xff0c;僅供個人學習參考。 文章目錄 網絡通信模型協議分層計算機網絡發展計算機網絡功能什么是協議為什么分層郵局實例 OSI模型OSI協議模型OSI七層模型OSI七層的功能簡介 TCP/IP模型OSI模型與TCP/IP模型TCP/IP協議族的組成各層PDU設備與…

如何使用通義靈碼完成PHP單元測試 - AI輔助開發教程

一、引言 在軟件開發過程中&#xff0c;測試是至關重要的一環。然而&#xff0c;在傳統開發中&#xff0c;測試常常被忽略或草草處理&#xff0c;很多時候并非開發人員故意為之&#xff0c;而是缺乏相應的測試思路和方法&#xff0c;不知道如何設計測試用例。隨著 AI 技術的飛…

批量清空圖片的相機參數、地理位置等敏感元數據

我們在使用相機或者手機拍攝照片的時候&#xff0c;照片中都會帶有一些敏感元數據信息&#xff0c;比如說相機的型號&#xff0c;參數&#xff0c;拍攝的時間地點等等。這些信息雖說不是那么引人注意&#xff0c;但是在某些時候他是非常隱私非常重要的。如果我們將這些信息泄露…

SQL優化算法解析 | PawSQL 如何將EXISTS子查詢“秒拆“為JOIN連接

在數據庫性能調優中,子查詢優化是提升查詢效率的關鍵點之一。今天,我們將分享一個使用 PawSQL 對EXISTS子查詢進行重寫優化的案例,展示如何通過合理的SQL重寫與索引設計,實現超過487516.45%的性能提升! 一、案例分析&#xff1a;EXISTS子查詢的性能困境 這個查詢的目的是找出…

大模型day1 - 什么是GPT

什么是GPT 全稱 Generative Pre-trained Transformer 是一種基于 Transformer 架構的大規模 預訓練 語言模型&#xff0c;由OpenAI研發&#xff0c;但GPT僅僅只是借鑒了Transformer 中 Decoder 的部分&#xff0c;并且做了升級 Transformer 架構 Transformer架構 是一種用于…

MDM功能演示:遠程鎖定與數據擦除,保障企業移動設備安全

在當今高度互聯的商業環境中&#xff0c;企業數據伴隨著員工穿梭于不同城市、時區和設備之間。智能手機、平板電腦和筆記本電腦賦予員工隨時隨地辦公的能力&#xff0c;但也帶來了新的安全挑戰&#xff1a;設備一旦遺失或落入不當之手&#xff0c;企業數據就面臨泄露風險。 無…

深度集成學習不均衡樣本圖像分類

用五個不同的網絡&#xff0c;然后對分類概率進行平均&#xff0c;得到分類結果。基本上分類精度可以提升10% 1.導入基本庫 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…

從零開始學java--泛型

泛型 目錄 泛型 引入 泛型類 泛型與多態 泛型方法 泛型的界限 類型擦除 函數式接口 Supplier供給型函數式接口&#xff1a; Consumer消費型函數式接口&#xff1a; Function函數型函數式接口&#xff1a; Predicate斷言式函數式接口&#xff1a; 判空包裝 引入 …

5?? Coze+AI應用基礎教學(2025年全新版本)

目錄 一、了解應用開發 1.1 扣子應用能做什么 1.2 開發流程 1.3 開發環境 二、快速搭建一個AI應用 2.1 AI翻譯應用介紹 2.2 設計你的應用功能 2.3 創建 AI 應用項目 2.4 編寫業務邏輯(新建工作流) 2.5 搭建用戶界面 2.6 效果測試 2.7 發布應用 一、了解應用開發 …

工會成立100周年紀念,開發職工健身AI運動小程序、APP方案推薦

時光荏苒&#xff0c;轉眼間2025年五一將至&#xff0c;這一年對于中華全國總工會而言&#xff0c;具有非凡的歷史意義——它將迎來成立100周年的輝煌時刻。為了慶祝這一盛事&#xff0c;各級工會組織將精心籌備了一系列豐富多彩、形式多樣的紀念活動&#xff0c;旨在展現工會百…

【深度學習】Ubuntu 服務器配置開源項目FIGRET(PyTorch、torch-scatter、torch-sparse、Gurobi 安裝)

開源項目網址&#xff1a;https://github.com/FIGRET/figret 該項目在SIGCOMM2024發表&#xff0c;用深度學習方法處理流量工程中的突發問題 1. 創建新的 Conda 環境 使用國內鏡像源創建環境? conda create -n figret python3.8.0 --override-channels -c https://mirrors.…

【SpringCloud】從入門到精通(上)

今天主播我把黑馬新版微服務課程MQ高級之前的內容都看完了&#xff0c;雖然在看視頻的時候也記了筆記&#xff0c;但是看完之后還是忘得差不多了&#xff0c;所以打算寫一篇博客再溫習一下內容。 課程坐標:黑馬程序員SpringCloud微服務開發與實戰 微服務 認識單體架構 單體架…

MySQL中動態生成SQL語句去掉所有字段的空格

在MySQL中動態生成SQL語句去掉所有字段的空格 在數據庫管理過程中&#xff0c;我們常常會遇到需要對表中字段進行清洗和整理的情況。其中&#xff0c;去掉字段中的空格是一項常見的操作。當表中的字段數量較少時&#xff0c;我們可以手動編寫 UPDATE 語句來處理。但如果表中包…

【Grok 大模型深度解析】第二期:架構探秘與訓練哲學

在上一期的內容中,我們對 Grok 大模型從技術溯源的角度,了解了它從 Transformer 架構局限性出發,邁向混合架構創新的歷程,同時也梳理了從 Grok - 1 到 Grok - 3 的版本迭代所帶來的技術躍遷以及其獨特的差異化優勢。這一期,我們將深入到 Grok 大模型的架構內部,探究其精妙…