使用NDk的场景:
1.某些方法,是使用C,C++本地代码实现的,然后,我想在Java中调用这些方法。这个时候,就需要使用到JNI技术。
为什么要使用C,C++代码实现呢?
原因是:
1.某些功能,需要使用到第三方的类库来实现,而第三方类库是用C或者C++写的,只有C或者C++代码才可以使用到该类库。于是,
就用C,C++代码实现。然后,实现后的方法,就供Java代码调用。
2.某些功能,使用C,C++代码来实现,速度和性能会高很多。比如,视频传输部分的代码。这个时候,将这部分功能,使用C,C++实现,然后,以方法的形式暴露给Java代码调用。
NDK开发步骤:
开发步骤:
1.在一个Java类中,比如MainActivity.java,声明要使用C,C++代码实现的本地方法,比如stringFromJNI方法;并且要有载入动态库的那一行代码,虽然,此时动态库还没有生成。
2.编译该Java类,MainActivity.java。得到MainActivity.class文件。(使用Android NDK时,无需这一步)
3.使用javah MainActivity.class生成一个可以在C,C++代码中使用的头文件。(使用Android NDK时,无需这一步)
4.使用C,C++代码实现MainActivity.java中声明的方法。在这个实现代码中,要包含3中生成的头文件(使用Android NDK时,无需这一步);然后,里面的代码,语法,方法,都是遵照JNI接口的。
5.编写Android.mk,告诉编译系统如何将C,C++代码编译为一个动态库(.so)。
使用步骤:
上述开发步骤完成之后,接下来就是编译:
1.在JNI目录下,输入命令ndk-build,如此,编译系统将会自动编译各种平台下的动态库。
2.第1步完成之后,就可以编译android项目,生成的apk就使用得到了动态库。
如此就完成了。
总结:
1.在Java代码这边,只需做两个步骤:一个是声明要调用的本地方法;一个是要加载的动态库。这个在没有生成动态库的时候,就要在代码中表示。
2.接着要做的事情,就是关键的,就是,使用C,C++代码实现本地方法。在使用变量,数据类型方面,要遵照JNI接口中定义的方式。这里面,就要使用JNI方面的知识,比如,JNI中的数据类型与Java中的数据类型的对应关系;JNI中字符串和Java中字符串的转换关系等。
其它的,当实现了C或者C++代码后,编写一个Android.mk,描述如何编译C,C++代码便可以。然后,编译生成动态库;然后,再编译android项目,项目中会包含生成的动态库(.so)。
图示步骤:
1.
2.
Java中的实现代码:
3.写一个C程序,该C程序中实现了Java中要使用的本地方法。如下,先创建一个jni目录,里面存放实现的C代码:
4.编写Android.mk,描述JNI中的源文件如何编译成为一个模块。
如下:
上述代码,说明:1.最终的模块名 Myhello-jni;2.被编译的源文件是helloJNI.c。
5.借助NDK工具,实现编译,生成动态库:
然后,整个Android项目就会变为:
其中:obj文件夹和libs中的.so是NDK工具编译后生成的东西。
6.按照往常的方式,编译android项目,生成apk
如下是最终的结果: