如何在Android Studio下进行NDK开发
最近项目需要用到NDK的一些东西,所以就随便看了看,虽然网上一大堆,但是谁叫我是一个爱学习的人呢?不做笔记就浑身不舒服,因此写下一些笔记,给初学的人少走一些弯路吧!
好了言归正传,我手里拿到一个eclipse开发的项目,转移到AS各种报错,心累,最后解决了大部分爆红,突然发现出现了这么几个玩意(看下图结构),以前没接触过,很尴尬,然后就找资料,然后就发现新大陆般成谜其中无可自拔!!!最后我也发现通过NDK可以干另外一件很有意思的事情,如果你的公司对推送很重视的话(问:为啥不直接用第三方推送?答:用户KILL App后不能收到推送。然后谁叫我们公司是创业公司呢?所有的东西能用程序写出来的能不花钱就不花钱。),可以解决百分之七十左右KILL APP之后不能收到推送的问题。
DNK
一:首先配置如上图,NDK得下载,配置完这个如果出现这个错误(No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android)说明缺少文件哈附上NDK下载链接,下载完解压,对比你本地这个toolchains的文件缺少啥就粘贴复制(一般缺少 mips64el-linux-android这个文件)。NDK下载
配置NDK
toolchains文件夹下
配置SDK
配置完成以后就开始我们的开发了
二:首先声明原生方法,必须加上native,告诉程序这是一个原生方法。在具体java代码调用时,和调用java的其他方法一样,直接调用就可以了。activity代码:
看到飘红的就是我们申明的原生方法
System.loadLibrary("talk");这个就是加载库,需要注意的是加载的库名即编译生成的库名,去掉前缀lib和后缀so。
这个地方我是自己建的jnilibs,一般你们都是直接放在libs下面的哈
然后我们make project一下,(不要告诉我你不知道make project在哪里哈!!!),我们的目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。这个过程我相信大家很熟悉吧。哈哈!下面我们来点重头戏,生成.h文件。
三:我们在AS的控制台打开Terminal或者工具栏打开view ->ToolsWindows->Terminal
执行命令cd app\src\main,然后我们进入src\main\目录下;这个时候需要很细心了,因为我们马上要执行一段很长的命令了,javah -d jni -(classpath这是你要生成头文件java类的绝对路径,可以直接把包名粘贴过来,然后把.上你的java类 )\Users\beijingnixun\smart_home.ihomephone.v700.Talk;
下面我们来讲解一下:
<1>javah 是生成头文件需要的工具。
<2>-d jni 是在你的工程下生成jni目录,到时会在这个目录下建JNI开始的C/C++源文件的。
四:然后剩下步骤按照下图
生成c/c++
填写名称
配置cpp文件
最后如果报错可能这个地方未填写
五,生成.so文件
这一步最重要,前面的都是铺垫,我们最主要的就是生成 .so文件然后放在jinlib里面。
我们现在gradle里面添加modulName以及添加支持cpu库,写到这里突然想起来差两个东西,这两个东西也很重要就是.mk文件,这里我们不讲.mk文件哈,有兴趣的自己去百度。我们讲这两个怎么写,首先在jni里面建立两个文件一个命名为Android.mk一个命名为Application.mk。看下图:
Application.mk
说一下里面的参数:APP_ABI这个是.so文件支持的库。APP_PLATFORM这个是因为如果你报错关于targetSDK之类的错误,你就加上这句话,然后android-1(这个1你要写你studio下报错里面有一个minSdk版本号)
Android.mk
Android.mk这个里面你直接复制粘贴就好:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := talk //依赖项的名称,跟你gradle里面填写的moduleName以及你talk.java文件里面lib引用的名称保持一致LOCAL_SRC_FILES := jnitalk.c//在你jni里面生成的.c文件名include $(BUILD_SHARED_LIBRARY)
现在我们准备好了所有的工作,下一步我们就生成.so文件。反键选择JNI文件夹--》Open in terminal。如下图:
进入jni文件在terminal
然后我们输入命令ndk-build然后你就会看到你生成了.so文件,如果报错找不到ndk那是你没配置好ndk环境,这个希望你们自己去百度。好了,现在ndk流程基本完了。我们就剩下调用了。这个调用不用我教你吧,类名点方法。你就可以看到c层给你返回的消息了。本篇文章暂时介绍到这里,下一章我打算更新一篇双进程守护。谢谢各位同学花费宝贵的时间观看。