zuihaobushi 2012-07-08
JNI:全称Java Native Interface。是java平台的一部分
JNI允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。类似于.Net Framework上的p/invoke,可以让C#或Visual Basic.Net可以调用C/C++的API,所以说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows平台使用 JNI是是经常的。比如一些算法的实现。
JNI的副作用:
请记住,一旦使用JNI,JAVA程序就缺少了JAVA平台的两个优点:
1、 程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。
2、 程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。
一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。
NDK:全称Native Development Kit。是android平台的一部分。
提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。
比较简单的说,NDK是一套交叉编译工具,它可以帮你把你用C或C++书写的代码,编译为.so(类似与win下的.dll)格式的文件,
使你可以在你的Android程序当中用Java语言(JNI)调用这些代码。
什么时候使用NDK:
1、当你想在Java中调用你的C、C++代码时你就可以用它(废话?),那么什么时候你可能考虑使用C、C++代码呢?比如说,你原来用C、C++写过一个游戏程序,里边有你大量的封装好的游戏业务逻辑、算法等代码,你现在想把这个游戏移植到Android上去,怎么办?难道这些业务逻辑、算法要全部用Java重写一遍嘛?现在有了NDK,不用了,你可以直接编译移植这代码了,所以说如果你有代码复用需求的时候,你就可以用它。
2、再举一个例子,比如说你现在用Android手机的摄像头采集图片信息,采集后的图片你使用Java书写了一个压缩算法进行压缩操作,这个算法非常的耗时,耗费CPU,效果很不理想。这时你就可以尝试采用C来书写这个压缩算法,这时你就可能发现,改用C代码执行后,效率提高了几倍乃至十几倍。当你的客户对程序的性能、速度要求比较高的时候,你也可以考虑用C、C++代码编写部分代码,以满足客户要求。
3、使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的。
所以说如果没有NDK编译的话,你的这些代码在Android上是跑不起来的。