首页 > 编程语言 >Android NDK入门:在应用中加入C和C++的力量

Android NDK入门:在应用中加入C和C++的力量

时间:2024-03-15 11:00:11浏览次数:27  
标签:NDK Java Kotlin 代码 C++ 本地 Android

目录

​编辑

NDK的设计目的

与Java/Kotlin的结合

使用场景

开发流程

设置项目以支持NDK

编写本地代码

使用JNI连接本地代码和Java/Kotlin代码

编译和运行你的应用


 

自诩方向是android方向的移动端开发工程师,却从来没有真正仔细了解过NDK,这里就详细的整理了解一下ndk是什么。

笼统的说,NDK和平时经常打交道的SDK对比:SDK为应用开发提供了一套全面的工具和接口,适用于大多数开发任务和应用程序类型。而NDK则提供了一种方法,允许开发者针对性能关键部分使用更底层的编程语言,以达到优化性能的目的。

NDK的设计目的

NDK主要是为了允许开发者在性能敏感的应用部分使用C或C++进行编程,以此来提高应用的执行效率。这些性能敏感的部分通常包括复杂的数值计算、物理模拟、图形渲染等。NDK通过允许开发者直接访问系统硬件和进行底层操作来实现性能的优化。

与Java/Kotlin的结合

大多数Android应用的开发仍然建议使用Java或Kotlin等高级语言,因为它们可以更加高效地利用Android平台提供的丰富API和管理应用的生命周期。这些高级语言运行在Android运行时(ART)之上,通过虚拟机管理内存和执行,简化了开发过程。使用NDK并不排除使用Java或Kotlin;相反,通常建议将它们结合起来使用,即在应用的大部分UI和高级逻辑中使用Java/Kotlin,在需要优化性能的部分使用C/C++。

使用场景

NDK适用的场景包括但不限于游戏开发、多媒体处理(如视频编解码)、复杂的物理计算等领域。在这些领域,应用的性能直接影响用户体验,因此使用C/C++来优化这些计算密集型任务是非常有意义的。

开发流程

设置项目以支持NDK
  • 确保Android Studio安装了NDK、CMake和LLDB(通过Android Studio的SDK Manager进行安装)。
  • 在项目的build.gradle文件中配置NDK路径和CMake。这告诉Android Studio如何找到和使用NDK工具链来编译代码。
编写本地代码
  • 在项目中创建一个C或C++文件。这些文件通常放在src/main/cpp目录下。
  • 编写本地代码逻辑。例如一个执行复杂数学运算或处理图像的函数。
#include <jni.h>

JNIEXPORT jint JNICALL
Java_com_example_myapp_MainActivity_addTwoIntegers(JNIEnv *env, jobject thiz, jint first, jint second) {
    return first + second;
}
使用JNI连接本地代码和Java/Kotlin代码
  • JNI是一种框架,允许Java/Kotlin代码运行本地代码(C/C++)。
  • 我们需要在本地代码中声明JNI方法,然后在Java/Kotlin代码中声明这些本地方法为native。这些native方法就是调用本地代码的入口点。
  • CMakeLists.txt文件中声明本地库,以便CMake知道如何编译本地代码。
// MainActivity.java

public class MainActivity extends AppCompatActivity {
    
    // 加载包含native方法的库
    static {
        System.loadLibrary("native-lib");
    }

    // 声明native方法
    public native int addTwoIntegers(int first, int second);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 调用native方法
        int sum = addTwoIntegers(3, 4);
        Log.d("MainActivity", "The sum is: " + sum);
    }
}
编译和运行你的应用
  • 使用Android Studio构建项目。它会自动使用CMake和NDK工具链来编译本地代码,并将其包含到应用中。
  • 运行应用。当Java/Kotlin代码调用标记为native的方法时,它会执行C/C++文件中编写的相应本地代码。

可以用纯C++开发一个应用吗?

笔者的讯息好像是不能

但是可以利用各种方式,一些额外工作,来用C++构建应用的各种地方、更多功能

标签:NDK,Java,Kotlin,代码,C++,本地,Android
From: https://blog.csdn.net/m0_63629756/article/details/136658105

相关文章

  • 在 Android 上恢复已删除文件的 5 种简单方法
    您可能会因为意外删除、未完成的Android更新、手机意外关机等原因而丢失Android上的重要数据。新技术的发展使许多手机功能或程序能够从内部恢复丢失的数据。在Android上恢复已删除文件的5种简单方法然而恢复成功率的不确定性也成为人们克服数据丢失困境的重要考虑......
  • Android中的NFC操作
    目录1.申请权限2.设置意图过滤器3.判断NFC功能是否可用(NfcAdapter)4.NFC感应(NfcAdapter)启用与禁用5.NFC数据解码6.案例代码一览NFC的全称是“NearFieldCommunication”,意思是近场通信、与邻近的区域通信。该功能由NfcAdapter(NFC适配器)控制。1.申请权限<!--N......
  • QT6.6下android编译及调用自定义so库方法
    一.问题概述   最近需要把QT程序从5.12的桌面环境移植到QT6.6的android下,项目中有很多DLL库要重新编译为so文件,移植到android环境然后调用,中间有很多坑,虽然大体和桌面系统用法相同,但细节上还是有区别的,尤其是so库的调用方法上,过程中也是debug了两天才解决,如果你也遇到了同......
  • C++入门
    1、C++初识1.1、第一个C++程序编写一个C++程序总共分为4个步骤:创建项目;创建文件;编写代码;运行程序。1.2、注释单行注释://描述信息多行注释:/*描述信息*/1.3、变量变量存在的意义:方便我们管理内存。变量创建的语法:数据类型变量名=变量初始值; inta=10;1.4......
  • 单调栈C++
    一、每日温度  1、题目:请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。例如,给定一个列表temperatures=[73,74,75,71,69,72,76,73],你的输出应该是[1,1,......
  • C++模板的显式具体化
    C++模板C++没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。例如有下面的函数模板,它用来获取两个变量中较大的一个:template<class T> const T& ......
  • KTL 一个支持C++14编辑公式的K线技术工具平台 - 第九版,数据分析工具。支持通达信日线
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL国内仓库:https://gitee.com/bbqz007/KTL CoreAnimationforWindows: https://github.com/bbqz007/xwzqt5 一个超简单的Qt5窗口语法: https://gith......
  • (C++)二分
    二分​ 二分,他可以应用的范围特别广,即使是你想不到的地方他也可以二分。​ 例如:Acwing790数的三次方根这题可以直接二分题目所要求的答案,通过不断逼近三次方后的结果来二分;Acwing5407.管道,这题里可以直接二分时间,然后合并区间查看是否满足;Acwing730.机器人跳跃问题可以......
  • C++ | 蓝桥题库区间或(位运算)
    一开始看题解很晕,这里采用前缀和方式的思想是:按位贡献,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。(1<<w)1左移w位相当于2的w次方,prefix[w][r]-prefix[w][l-1]相当于[l,r]这段距离上有1就让ans加上1,没有就不加。#inc......
  • C++函数模板的实参推断
    C++模板在使用类模板创建对象时,程序员需要显式的指明实参(也就是具体的类型)。例如对于下面的Point类:template<typename T1, typename T2> class Point;我们可以在栈上创建对象,也可以在堆上创建对象:Point<int, int> p1(10, 20);  //在栈上创建对象Point<char*, c......