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的方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

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