引言
android开发人员使用的语言绝大多数是java, 至于koltin等其他语言暂时不做讨论。故此如果需要使用底层或者第三方so库就不得不使用ndk来调用。本文暂时只对旧的方式-->android.mk做讨论,之后会增加一个cmake的方式。本人之前使用过第三方的c文件调用完成滤镜功能,但是老话说得好:温故而知新。现在再使用起来发现忘记了很多细节以及遇到了很多问题,查阅了资料以及自己的研究,下面先对使用android.mk的方式做一个总结。
何时使用NDK?
Google仅在极少数情况下建议使用NDK,有如下使用场景:
必须提高性能(例如,对大量数据进行排序)。
使用第三方库。举例说明:许多第三方库由C/C++语言编写,而Android应用程序需要使用现有的第三方库,如Ffmpeg、OpenCV这样的库。
底层程序设计(例如,应用程序不依赖Dalvik Java虚拟机)。
至于什么是NDK 什么是JNI等一系列的理论性知识本文暂不做解释,有兴趣的童鞋可以查阅相关知识
如何使用
在项目底下建立一个jni文件夹,之后的c文件、头文件、android.mk文件等都需要放在次文件夹底下。
模拟一个场景:项目需要使用一个打卡的设备,且厂家提供了一个c文件
我们可以看到第一行:JNIEXPORTvoidJNICALL Java_serialport_jujiang_com_ndktest_SerialPort_close。其中serialport_jujiang_com_ndktest_SerialPort的意思是serialport.jujiang.com.ndktest包底下有个 SerialPort.java的类,这个类里面有个close方法与c文件中的close方法相关联。所以我们此时要做的就是在相关包底下新建这个类
实际上要说明的是这里的顺序应该是相反的。厂家提供的c文件中close方法是固定的 但是前面的包名以及类名肯定是与项目不一致的。所以我们需要先新建一个类名,里面有close方法。然后再把我们的c文件做相应的修改。特别注意的是android studio有一个bug是需要建立一个空的c文件。所以此时需要在jni文件夹底下建立一个空的c文件。比如empty.c 里面的内容可以是完全空白的。
1新建SerialPor类
2 rebuild Project
3找到相应的class文件
然后在命令窗口定位到classes\debug目录下,执行命令(注意区分大小写)
javah -jni serialport.jujiang.com.ndktest.SerialPort
生成对应的头文件SerialPort.h
这一步主要是为了生成头文件供 c文件引用,实际上有的厂家或者第三方会提供头文件,那么此时这一步可以省略。
生成的文件内容如下:
我们可以看到和c文件类似,如果是厂家或者第三方提供的则同样需要根据具体的包名做修改。
修改build.gradle配置
Android.mk文件
生成so文件
首先需要使用的命令是 ndk-build,将目标定位到jni的目录底下
比如:E:\myProject\NdkTest\app>cd src/main/jni
然后执行命令 ndk-build。之后就会在jnilib或者libs所在的文件夹底下生成对应的so文件。
总结
以上就是基本的ndk使用。基本的细节都有涉及到.如遇到什么问题欢迎讨论。之后会增加cmake的方式。