设为首页 加入收藏

TOP

Android NDK基础介绍及例子(一)
2023-08-26 21:10:21 】 浏览:223
Tags:Android NDK

Android开发中的NDK到底是什么?(详细解析+案例) - 知乎 (zhihu.com)

NDK介绍

(1)简介

定义:Native Development Kit,是 Android的一个工具开发包

  • NDK是属于 Android 的,与Java并无直接关系

作用:快速开发CC++的动态库,并自动将so和应用一起打包成 APK

  • 即可通过NDKAndroid中 使用JNI与本地代码(如C、C++)交互

应用场景:Android的场景下 使用JNI

  • Android开发的功能需要本地代码(C/C++)实现

java调用c的步骤

  1. package com.fs.test;
    public class HelloWorld {
    //本地方法
    	private native void show();
    	public static void main(String[] args)
    	{
    		System.loadL ibrary("wgr");
    		new HelloWorld().show();
    	}
    }
    

    1.System.loadL ibrary("wgr");加载动态库

    2.private native void show();声明一个动态库对应的本地方法调用libwgr.so中的函数
    *void Java_ com_ fs_ test HelloWorld_ show(JNIEnv env, jobject thiz)

    3.直接调用show函数(动态库中与show对应的函数)

一、NDK/JNI

NDK

NDK(Native Development Kit)-原生开发工具包,使得能够在Android上
去使用C/C++代码;

JNI

JNI即Java Native Interface,Java和Native接口,就是Java和C/C++之间通讯的桥梁; 为什么要有JNI,因为Java和C/C++之间是无法直接相互调用的,也就是无法直接通讯,就和Java和JS之间也不能直接相互调用,中间需要翻译者来处理,JNI就是为了实现Java和C/C++之间这两种不同语言之间的通讯的;
JNI并不是Android中的技术,它是Java本身就具有的功能,是由JVM支持JNI功能

-那么为什么需要在Android上去使用C/C++代码?

因为我们知道开发Android我们是使用Java/Kotlin语言进行开发的,那么不论是Java还是Kotlin,最终都是编译成字节码文件.dex文件,然而字节码文件是Java/Kotlin经过一定语义编译之后的产物,并不是完全可以运行的机器码指令;所以运行应用时还是需要进一步的编译成机器码才能够执行;
而C/C++是完全的编译型语言,编译之后是机器码文件,运行应用时,可以直接执行的,所以效率肯定是要比Java/Kotlin要高的;所以一些对一些比较耗性能的操作,如音视频编解码,图像处理等操作,最好还是交由C/C++代码中去执行,这样能够大大提高应用的执行效率;

NDK开发

新建一个Native项目

Android Studio 新建一个项目,新建项目时,项目模板选择Native C++
新建项目成功后,我们可以看一下项目的目录结构;

在src/main目录下 有一个cpp目录,与java目录同级,cpp目录下有一个 CMakeLists.txt文件和native-lib.cpp
CMkeLists.txt就是CMake脚本文件
native-lib.cpp 是C++源文件

app Module build.gradle中会有一些NDk相关的配置:

plugins {
    id 'com.android.application'
}

android {
    namespace 'com.example.nativec'
    compileSdk 33

    defaultConfig {
        applicationId "com.example.nativec"
        minSdk 24
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

设置调试模式

在Run/Edit Configuration/Debug Configurations中 Debugger 调试有四个选项
Auto、 自动检测
Java、 只调试Java代码
Native、 只调试Native代码
Dual、 Java+Native两种都用
注意不要选择Java和Native,选择Auto或者Dual

编写编译脚本文件CMakeLists.txt

CMake是一个跨平台的C++编译工具,所谓编译就是把C++代码编译成静态库或者动态库
CMakeLists.txt就是CMake的编译脚本文件,
CMake编译C++是通过CMakeLists.txt编译脚本来进行编译的;
CMa

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇音视频FAQ(一):视频直播卡顿 下一篇Glide源码解析三(注册组件)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目