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

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类


SerialPort.java


2 rebuild Project

3找到相应的class文件


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

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

生成对应的头文件SerialPort.h

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

生成的文件内容如下:


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

修改build.gradle配置


其中serial_port指明将要生成的so文件名

Android.mk文件


生成so文件

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

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

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

总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,065评论 25 708
  • Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...
    AlphaGL阅读 3,777评论 0 24
  • 一、NDK产生的背景 Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于J...
    Ten_Minutes阅读 3,540评论 1 27
  • 本人为初学者,文章写得不好,如有错误,请大力怼我 或者看这里 如何使用jni进行开发 本文主要针对Android环...
    AlbertHumbert阅读 4,694评论 2 12
  • 前言:工具是次要的。前言:但是,我们不能放弃追逐好的工具。前言:而且,我们要勇于抛弃陈旧的工具。 一入前端海,就要...
    松鼠杨阅读 1,367评论 0 1