| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 8、Ndk开发小记一 -> 正文阅读 |
|
[移动开发]8、Ndk开发小记一 |
一、背景 1.1 JNI介绍 起源: 从jdk1.1开始 定义:
Java和C/C++不同 ,Java在运行时需要编译成虚拟机可以运行的class字节码,然后再由虚拟机编译成机器码,而C/C++可以直接编译成机器码,所以效率上Java不如C/C++。下面我们来看看JNI调用示意图,从下图可以得知 ,JNI技术通过JVM调用到各个平台的API , 虽然JNI可以调用C/C++ ,但是JNI调用还是比C/C++编写的原生应用还是要慢一点 ,不过对高性能计算来说 ,这点算不得什么 ,享受它的便利 ,也要承担它的弊端 。 开发者一般使用 作用: 使 说明: 1、JNI是Java调用Native语言的一种特性; 2、JNI是属于JAVA的,与Andriod无直接关系; 3、JNI扩展了JVM的功能; 1.2 NDK 起源: Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android?SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。 在Android?SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。 不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android?SDK文档里,找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。 于是NDK就应运而生了。NDK全称是Native?Development?Kit。NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。 定义: NDK是Google开发的 Android 软件开发包 SDK 的相关工具集,用来扩展 Android SDK 的功能,能够快速开发C,C++的动态库,并生成动态链接库,最终自动将so和应用打包成APK,主要用于Android的JNI开发; 作用: NDK集成了交叉编译器,并提供了相应的make文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改make文件(指出"哪些文件需要编译"、"编译特性要求"等),就可以创建初so,然后NDK可以自动将so和java应用一起打包,极大地减轻了开发人员地打包工作。? 说明: 1、NDK是属于? 2、可通过? 3、提供了把.so和.apk打包的工具(JNI开发没有,只是把.so文件放到文件系统的特定位置); 4、Android NDK 不是一个单独的工具:它是一个包含 API、交叉编译器、链接程序、调试器、构建工具、文档和示例应用程序的综合工具集; 1.3 NDK和JNI关系 二、NDK工程创建 查了一些资料,早期使用AS或eclipse创建NDK还是挺复杂的事,现在使用AS就简单多了。笔者使用的Android Studio Bumblebee?|?2021.1.1,应该是4.3左右的版本 C++ Standard 2.1 对比 左边是NDK项目,右边是普通安卓项目 CMakeLists CMke:允许开发者编写一种平台无关的CMakeLists文件,来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,入Unix的Makefile或windows的Visual Studio工程。从而做到“Write Once ,run everywhere"。 关于CMake的命令行以及CMakelists文件的编辑,可以查看网上的教程 跑下程序,没啥问题,下面修改下官网demo,增加java接口 2.2 自定义JNI接口类 不在MainActivity中加载.so库,而是新建了一个JNI工具类来完成加载.so库和声明native方法的任务。 结语:引用了很多大牛的文章,在前期不明白原理时候,踩过很多坑,想总结下来,写完后,发现这些坑都不在了,等后期开发中再复现下bug吧 参考文献: Java筑基 - JNI到底是个啥 - 码农参上 - 博客园 Android:JNI 与 NDK到底是什么?(含实例教学)_Carson带你学Android的博客-CSDN博客_ndk Android NDK具体作用讲解_小赵在京城的博客-CSDN博客_ndk有什么用 Android NDK 简介(Android NDK 教程 一)_李斯维的博客-CSDN博客_android ndk教程 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 23:39:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |