第一篇:对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++之间的关系是: 
Markdown

java代码执行步骤:

Markdown

其实呢 ,我们android系统中就有很常见的java和c之间调用的实例。

Markdown

比如:Android下的jni的工作模式: 
Markdown 
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

Markdown

简单介绍下dev-cpp.exe运行和编译

Markdown

c语言helloworld代码编写

  • 1.声明头文件,相当于java的导包。
#include <stdio.h>
  • 1
  • 2.写main()方法

    main(){}
  • 3.为了观察程序执行的结果,需要调用windows系统的一个指令

    system("pause"); 

博客地址

http://blog.csdn.net/androidstarjack/article/details/71156474

原创粉丝点击