Android NDK 开发入门学习

news2024/11/16 12:44:49

android ndk技术早已经不是什么新的技术,但是由于工作中没有涉及到,所以一直没有尝试,今天抽空了解学习一下,顺便记录一下,方便后续回顾,由于是刚学习,很多资料也是网上找的,写的不对的地方请多多谅解。

1、NDK 概念

  NDK  即Native Development Kit,是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
 

  简单来讲就是在java中调用C/C++代码的方式

2、开发环境配置

    android 开发环境安装Android Studio即可,并下载NDK工具(自己到网上下载),然后配置路径,系统环境变量,这部分就不细讲了。

2、定义Native方法,加载so库

   直接创建一个java类

package com.example.myapplication;

public class NdkTest {

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

    public native int getSum(int a,int b);

}
3、gradle配置
android {
    
         .
         .
         .
        ndk{
           //定义生成的mk文件中的so名称
            moduleName"TestNdk"
            abiFilters "armeabi-v7a"
        }
    }

    buildTypes {
        
        sourceSets.main {

            jni.srcDirs = []  
            //生成so路径
            jniLibs.srcDir"src/main/libs"

        }
    }
}

4、创建jni目录

5、生成C/C++ 头文件

    

   运行后在jni目录下生成了头文件

   

6、native方法的实现,注意格式和参数不能写错

 

 7、生成so库文件,这里使用ndk-build构建

  在jni目录下创建Android.mk文件和Application.mk 文件

  Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := TestNdk
LOCAL_SRC_FILES := \
NdkTest.c \

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
# APP_ABI:是将要生成哪些 cpu 类型的 so, all 代表全部
APP_ABI := all
#APP——PLATFORM:生成的 so 的最低 android 版本
APP_PLATFORM := android-8

 创建ndk-build工具

   setting -> Tools -> 点击+号 , program 填写ndk路径,working directory 填写jni 路径

执行ndk-build后在libs下会自动生成对应的so库

8、到这里ndk部分就写完了,下面调用native接口看看运行结果

package com.example.myapplication;


import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NdkTest ndkTest = new NdkTest();
        int sum = ndkTest.getSum(100,100);
        Toast.makeText(MainActivity.this,sum+"",Toast.LENGTH_LONG).show();
    }
}

 运行结果如下

  

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 容器学习【1】

1.容器概述 1.1什么是容器 容器是一种沙盒技术,主要目的是为了将应用运行在其中,与外界隔离;及方便这个沙盒可以被转移到其它宿主机器。本质上,它是一个特殊的进程。通过名称空间(Namespace)、控制组&…

vivo 推送系统的容灾建设与实践

作者:vivo 互联网服务器团队 - Yu Quan 本文介绍了推送系统容灾建设和关键技术方案,以及实践过程中的思考与挑战。 一、推送系统介绍 vivo推送平台是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接…

BI实施项目干系人分析案例

最近有在学项目管理,做了个项目干系人分析的小案例 项目背景:BI决策报表实施项目,主要为了甲方公司高层及经理做一些决策报表。 1.识别项目干系人 项目组主要成员: 乙方:王某(技术leader)&am…

关于小波,Morlet,Grossmann,Meyer,Daubechies,Mallat

转自:未来数学家,向大佬致敬。 匈牙利电子工程师丹尼斯加博尔(Dennis Gabor)1946年提出加窗傅里叶变换,开创了在时间-频率平面上分析信号的方法,Gabor还发明了全息摄影术,这项工作让他获得了19…

Clickhouse的数据副本协同原理详解(借助ZK实现)

Clickhouse的数据副本协同原理详解(借助ZK实现) 文章目录 Clickhouse的数据副本协同原理详解(借助ZK实现)Clickhouse数据副本副本的特点 ReplicatedMergeTree原理解析数据结构Zookeeper内的节点结构元数据判断标识操作日志 Entry日…

【AXU3EG】Zynq UltraScale平台启动引导过程

Zynq UltraScale MPSoC(16nm) 的核心是两个 CPU 模块: 应用处理单元(APU):四核 ARM Cortex-A53,适合于 Linux 和裸机应用程序。实时处理单元(RPU):双核 ARM …

Unity 高级程序员应该具备怎样的能力?要怎样成长为 Unity 高级程序员?

如何从零基础小白成长为 Unity 高级程序员?【全篇学习内容免费!快来白嫖】 高能预警,下文包含从零基础新手到高级程序员一站式技术学习、学习方法、心态等内容,供各个阶段的同学进行参考。 从零基础到高级程序员 上干货 话不多说…

MySQL——存储过程和函数从零基础到入门必学教程(涵盖基础实战)

文章目录 目录 文章目录 前言 一、创建存储过程 二、在存储过程中使用变量 1.定义变量 2.为变量赋值 三、光标的使用 1.打开光标 2.打开光标 3.使用光标 4.关闭光标 四、流程控制的作用 1.IF语句 2.CASE语句 3.LOOP语句 4.LEAVE语句 5.ITERATE语句 6.REPEAT语…

碳酸氢锂硫酸锂溶液除钙镁

#碳酸氢锂硫酸锂溶液除钙镁 随着新能源汽车快速发展,以粗Li2CO3(85-98%)和工业级Li2CO3(98.5-99.0%)为原料制备高纯电池级Li2CO3(99.5-99.9%)的工艺的突破,显得尤为重要,正越来越受到人们的关注。 粗Li2CO3…

智能排班系统

大家好,我是csdn的博主:lqj_本人 担任本次比赛的队长,这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011…

安全技术交底大全

交底内容得过大,过宽,不要造成土建结构缺陷。02)管路敷设完后应立即进行保护其他工种在操作时应注意不要将管子砸扁和踩坏。(3)在碎板,加气板上别洞时,注意不要剔断钢筋,剔洞时应先用钻打孔,再护孔&#xf…

visual stdio c++调用python混合编程

visual stdio2019 c调用python混合编程 1.Python环境的搭建 关于环境创建可以参考https://blog.csdn.net/qq_36559788/article/details/123174309 这里python我用的是anaconda里的python38,并且没有debug库,所以我只用了release库 在vs中设置项目属性…

谈谈JVM的垃圾回收机制

目录 1. 死亡对象的判断算法 1.1 引用计数算法 1.2 可达性分析算法 2. 垃圾回收算法 2.1 标记——清除算法 2.2 复制算法 2.3 标记——整理算法 2.4 分代算法 1. 死亡对象的判断算法 对于支持垃圾回收机制的编程语言来说,常见的死亡对象的判断方法有引用计数…

成功上岸北大!总分418分,数学150分,经验贴+方法论

Datawhale干货 作者:葛云阳,杭州电子科技大学,Datawhale成员 前 言 大家好,我是北海。2023年以总分418分的成绩上岸北京大学信息工程学院计算机应用技术专业,其中初试第三,复试第五,总成绩第三…

《编程思维与实践》1038.排版

《编程思维与实践》1038.排版 题目 思路 分两个步骤进行解决: 1.在给定长度下找到每一行可以容纳的最多单词数(单词长度<M/2保证每行至少有两个单词); 2.输出时补充额外的空格. 其中,第一个步骤可以通过分割字符串将每个字符串存起来,再找到第一个超过给定长度M的单…

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置 Tomcat的选择: 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致,避免一些不必要的问题。 配置步骤: 1、首先进入云服务器创建好放置tomcat的文件…

UE5实现Runtime环境下绘制线功能

文章目录 1.实现目标2.实现过程2.1 C++实现2.2 蓝图调用3.参考资料1.实现目标 UE5在Runtime环境下基于PDI绘制线,GIF动图如下: 2.实现过程 在UE5 Runtime环境下常用的绘制线方法有使用以下几种方式。一是基于SplineMeshComponent,即使用已有的点位去初始化样条线,然后在挂…

Ae:合成查看器 - 视图选项

合成查看器、素材查看器、图层查看器等面板底部的视图选项大同小异。 放大率弹出式菜单 Magnification ratio popup 用于显示和控制当前的放大率。 默认为适应当前面板大小。 更改放大率时,只是改变了面板中预览的外观,而不是合成的实际分辨率和像素。 适…

数据挖掘实验-week8-关联规则挖掘(Association Rule Mining)

Contents 0. 引言0.1 关联规则挖掘0.2 Apriori算法 实验Step 1:Familiarize yourself with the arules package in R.1.1 Load the package.1.2 To load data into R enter.1.3 To get information about the total number of transactions in a file sample1.csv e…

【requests模块上】——02爬虫基础——如桃花来

目录索引 requests请求:1. 基于get请求:*基础写法:**带参数的get请求:* 2. 基于post请求: 获取数据:1. 获取json数据:2. 获取二进制数据: 引入: requests是python的第…