Android Ndk基础开发

引言

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文件

Android Ndk基础开发_第1张图片
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类


Android Ndk基础开发_第2张图片
SerialPort.java


2 rebuild Project

3找到相应的class文件


Android Ndk基础开发_第3张图片

然后在命令窗口定位到classes\debug目录下,执行命令(注意区分大小写)

javah -jni serialport.jujiang.com.ndktest.SerialPort

生成对应的头文件SerialPort.h

这一步主要是为了生成头文件供 c文件引用,实际上有的厂家或者第三方会提供头文件,那么此时这一步可以省略。

生成的文件内容如下:


Android Ndk基础开发_第4张图片

我们可以看到和c文件类似,如果是厂家或者第三方提供的则同样需要根据具体的包名做修改。

修改build.gradle配置


Android Ndk基础开发_第5张图片
其中serial_port指明将要生成的so文件名

Android.mk文件


Android Ndk基础开发_第6张图片

生成so文件

首先需要使用的命令是 ndk-build,将目标定位到jni的目录底下

比如:E:\myProject\NdkTest\app>cd src/main/jni

然后执行命令 ndk-build。之后就会在jnilib或者libs所在的文件夹底下生成对应的so文件。

总结

以上就是基本的ndk使用。基本的细节都有涉及到.如遇到什么问题欢迎讨论。之后会增加cmake的方式。

你可能感兴趣的:(Android Ndk基础开发)