在android开发中你的应用可能会想调用C/C++代码,那么就会出现这两个东西JNI和NDK,那么你可能会问它们是什么呢?它们有什么用呢?它们有有什么联系?接下来将对它们进行一个详细介绍。
JNI(Java native intereface)
Java Native Interface (JNI)标准是java平台的一部分。为Java应用程序提供调用本地方法的接口,也就是作为java与C/C++的桥梁,实现java调用C/C++或者C/C++调用java。JNI的首要目标在以库文件的形式调用本地方法,在WIndows下为DLL,在UNIX下为SO,也就是动态链接库。
NDK(Native Development Kit)
NDK是Google公司推出的帮助Android开发者通过c/c++本地语言编写应用的开发包(一套用于快速创建native工程的一个工具),包含了C/C++的头文件、库文件、说明文档和示例代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题,所以推荐初学者学好Java后再学习JNI。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
总结:
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提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题,所以推荐初学者学好Java后再学习JNI。
JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。NDK中需要用到JNI。
JNI实现java与C/C++沟通的步骤:
- 1、编写包含native本地方法的java类
- 2、通过javah工具生成C/C++语言的头文件
- 3、使用C/C++语言实现头文件
- 4、使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库
- 5、实际执行Java代码去和本地的C/C++代码互相沟通
下一篇文章将介绍我们的第一个利用NDK的app。