第一篇:对jni和NDK的认识
来源:互联网 发布:流体力学分析软件 编辑:程序博客网 时间:2024/06/02 01:06
JNI的基本概念?
Java本地开发接口 英文全称是 Java native interface。
什么是JNI?
jni是一个协议。这个协议用来沟通Java代码和外部的本地代码(c/c++),通过这个协议 ,Java代码可以外部的c/c++代码 ,外部的c/c++代码也可以 调用本地的Java代码。
由于java代码运行和执行都是基于虚拟机的。
简单说一下java 虚拟机的工作原理
我们都知道:.java源文件都需要通过编译器来编译成.class文件,这里可以说字节码文件,然后在Dalvik虚拟机的解释器 编译成特定的机器识别码。从而达到在机器上能够运行。
java语言面向对象,一般会把方法封装到对象里面。
C语言面向过程。所谓面向过程就是做任何的时候都是一步一步来的。
java方法调用c/c++方法是行不通的一般通过桥梁(jni)间接的调用c/c++。相当于我们所说的中间人。通过jnijava即可以调用c代码,c代码又可以调用java代码。
java和c/c++之间的关系是:
java代码执行步骤:
其实呢 ,我们android系统中就有很常见的java和c之间调用的实例。
比如:Android下的jni的工作模式:
System lib就是属于底层JNI的一部分。与之相关的
有ABI。
如何理解ABI?
ABI的全程是 application binary interface
简单的理解为应用程序二进制接口。
作用:
让java代码 调用底层的c/c++代码。
JNI和NDK的区别
- Java和C/C++互相通过的接口,是Java语言提供的Java和C/C++相互沟通的机制,目的通过JNI可以实现java和调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI 是本地编程接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。相互之间的调用。
- NDK是一系列工具的集合。
- 它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。
- 这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
应用场景
- 可以复用c/c++d的优秀的框架
- ffmpeg
- sfg 音视频播放等媒体的框架
- 7-ZIP 一个强大的压缩算法,效率比WRNR要更上一筹。
- opencore. 视频播放(Android4.0直线视频播放)
- 可以提升效率
- java代码是跨平台的,不直接操作硬件。由有Dalvik虚拟机进行解释执行。而IOS对的objectC编程语言直接操作硬件。效率比较高。
- art 提高app运行效率
- c代码直接操作硬件,可手动操作去释放内存。
- 一些小游戏等
- 智能家电,车载电脑(obd:onboard debug system)
- c代码反编译比较困难,不容易调试
- java容易反编译,容易看懂,安全性较低
怎么去使用jni?
- 首先要看懂c代码(通过慢慢积累要要c语言的基础)
- 其次要懂流程(属性jni规范)
- 最后要熟悉NDK开发工具(native delelop kits)
jni的准备工作
虽然我们的AndroidStudio和Eclipse都能开发C/C++代码,但是为了方面我们换一种专业的C开发的开发工具。
开发工具
dev-cpp.exe
1. 轻量级开发工具
2. 编译器gcc c99标准
如果大家之前学过C语言,会对dev-cpp.exe再熟悉不过了。但是小弟不猜,之前没有C的基础,所以在这个对于每一个细节都不想放过。
于是上网查了查其优点
用的优势:
* devcpp.exe是Bloodshed Dev-C++的界面主程序,用于开启该软件的WINDOWS界面程序。
* devcpp,体积小,但是功能强大。它包括多页面视窗、工程编辑器。
* 在工程编辑器中集合了编辑器、编译器、连接程序和执行程序。
* 提供语法显示高亮,以减少编辑错误。
工具下载地址:
dev-cpp.exe 我这边已经下好了,所以给大家分享一个下载连接:
链接:http://pan.baidu.com/s/1o7GOPU6 密码:f3vb
开始我的C世界的第一个HelloWord
简单介绍下dev-cpp.exe运行和编译
c语言helloworld代码编写
- 1.声明头文件,相当于java的导包。
- 1
2.写main()方法
main(){}
3.为了观察程序执行的结果,需要调用windows系统的一个指令
system("pause");
博客地址
http://blog.csdn.net/androidstarjack/article/details/71156474
- 第一篇:对jni和NDK的认识
- NDK探究之旅《一》——对jni和NDK的认识
- 第一篇:AndroidStudio NDK的配置和使用,jni的第一个demo
- 第一篇博客 对安卓的认识
- 对android NDK的认识
- Android面试题:对JNI和NDK的理解
- Android之对JNI和NDK的理解
- 第一篇 Android的认识
- JNI和NDK的区别
- JNI和NDK的区别
- JNI和NDK的区别
- JNI和NDK的区别
- JNI和NDK的区别
- JNI和NDK的区别
- JNI和NDK的区别
- JNI和NDK的区别
- NDK和JNI的使用
- NDK和JNI的区别?
- 7.排序、聚合函数、分组查询
- angularjs速成学习个人理解_2表达式
- 敌兵布阵(简单线段树)
- JavaScript深入学习[1]
- vue-cli 路由嵌套
- 第一篇:对jni和NDK的认识
- java
- HDU 1816 Get Luffy Out *(2-SAT+二分)
- 862A. Mahmoud and Ehab and the MEX
- POJ3273 Monthly Expense 二分法
- 人工智能入门简介及行业分析
- SAS数据集如何将为负数的部分,变为正数
- HDU 5127 Dogs' Candies【CDQ分治+动态凸包】
- 分析Hibernate:could not initialize proxy