zoukankan      html  css  js  c++  java
  • 【转】JNI和NDK的区别

    原文网址:http://blog.csdn.net/ithomer/article/details/6828830

    NDK(Native Development Kit)“原生”也就是二进制

    android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等

    java调用这样实现就需要用JNI(Java Native Interface)

    平时用的也就是google给我们封装的好的库,即底层实现用的不是Java,但都有统一的Java接口

    NDK的作用是“我们自己写本地代码”(C/C++),自己用JNI封装成Java接口

    比如我们想做个计算,显然这不是Java的强项,但可以用C/C++来写实现,返回一个运算结果就行了

    NDKr5已经实现了不用写一行Java代码开发程序了,只不过还是用到了虚拟机,细节被封装隐藏起来了而已

    对于JNI和NDK很多Android开发初学者没有搞明白这个问题

    JNI是Java调用Native机制,是Java语言自己的特性全称为 Java Native Interface,类似的还有微软.Net Framework上的p/invoke,可以让C#或Visual Basic.Net调用C/C++的API,所以说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows平台使用 JNI是是经常的,比如说读写Windows的注册表。

    NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例 代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的 问题,所以Android123推荐初学者学好Java后再学习JNI。

    NDK其实多了一个把.so和.apk打包的工具,这个是很重要的。

    而JNI开发并没有打包,只是把.so文件放到文件系统的特定位置。

    如果是做应用开发,则需要NDK工具,不然你开发的应用程序怎么给用户用呢?难道帮他重新编译文件系统?

    其他至于实现,java调用本地C/C++函数,及其编写方式,我觉得JNI和NDK没有什么区别。

    还有一个我个人理解,NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件,比如utils/Log.h

    而后者的资源更多,当然NDK正在努力开发中,以便支持更丰富的接口。

    参考推荐:

    JNI Tutorial

    Android NDK之JNI使用例子

    Android 使用NDK R5开发JNI应用详解

    Android NDK Hello

    NDK作用 : 是Google提供了交叉编译工具链, 能够在linux平台编译出在arm平台下执行的二进制库文件;

    Android JNI和NDK关系

    原文网址:http://blog.csdn.net/elfylin/article/details/6121466

    1、什么JNI

    Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

    上面过程分为2个部分:

    第一、用C语言生成一个库文件。

    第二、在java中调用这个库文件的函数。

    2、NDK

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

    个人理解,NDK就是能够方便快捷开发.so文件的工具。

    JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。

    3、java中调用.so文件代码

    其中,在java中加载库文件的代码如下:

         System.loadLibrary(*.so的档案名);

        例如,Android框架里所提供的MediaPlayer.java类,含指令:

         public class MediaPlayer{   

             static {

                       System.loadLibrary("media_jni");

                  }

         }

  • 相关阅读:
    软件包管理(rpm&yum)
    文本处理三剑客之sed
    压缩归档tar
    linux文件查找find
    vim编辑器
    正则表达式
    文本处理三剑客之grep
    常用文本处理、统计工具
    文件权限管理
    用户和组管理
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4306184.html
Copyright © 2011-2022 走看看