Android嵌入式开发之NDK初级入门 粘贴可用阅读可懂
前言:
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高些。如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ,然后需要编译生成,相当的蛋疼。要么是直接用Eclipse开发,但是前期配置也是一堆;真心蛋疼。
在AS开发NDK JNI也需要配置,不过相当Easy。第一步就是去官方下载个NDK包就可以了,像我的直接放在D盘就行了。关于怎么下载安装看这里 AD NDK会有介绍。
第二步就是就是直接写代码了,请往下看,简单的实现了一个C编写的加法通过自己编译的.so文件进行调用!
整体架构如下:
1、创建NdkJniUtils类
public class NdkJniUtils { public native int add(int a,int b); }
2、在MainActivity中调用NdkJniUtils
NdkJniUtils ndkJniUtils = new NdkJniUtils(); int add = ndkJniUtils.add(2, 5); tv.setText(add+"===");
3、打开黑窗口
如果点击之后,在Terminal中报错 找不到 包名.类文件,你就打开黑窗口 cmd 路径切换到你工程的NdkJniUtils的目录下。切换到此路径下之后 输入 javac NdkJniUtils.java之后 编译成class文件(有人会问,为什么不直接锤一下生成?答:也许是我电脑太次,不好使,我才用最稳定的黑窗口来生成...比较笨,大神勿喷)
用到的cmd命令: cd 空格 文件夹路径,即可进入到指定文件夹路径
cd.. 后退一层的命令
注意:编译完class文件之后,再回到NdkJniUtils类中加入如下代码(如果在生成class文件之前将本段放入类中则会出现转码错误):
static { System.loadLibrary("MySo");// 这个名是调用的.so文件名 必须要和Android.mk里的LOCAL_MODULE相同(如不懂请往下看) }
4、看图操作(这俩NB的插件配置教程网上特别多,我也就不详细介绍了...)
点击之后,他会在NdkJniUtils同级下创建一个 com_jiaxin_model6_NdkJniUtils.h 的.h文件,如果用工具生成.h文件报错的话,请往下看,成功则直接看下一步:
兄弟,如果你报错信息又是提示找不到类的话,你还得打开黑窗口敲命令了。。首先打开黑窗口后,进入该项目的NdkJnUtils类的目录下,敲入:javah -jni 包名.NdkJniUtils 然后,你就能看到生成了一个包名开头的.h文件
5、在jni目录(生成完.h文件会自动创建)下创建一个.c文件,我取名为jnitest
打开粘入这块儿代码即可:
#include<stdio.h> #include<jni.h> #include<stdlib.h> #include "com_jiaxin_model6_NdkJniUtils.h"
JNIEXPORT jint JNICALL Java_com_jiaxin_model6_NdkJniUtils_add (JNIEnv *env, jobject thisz, jint a, jint b){ return a+b; // 做了一个简单的加法..方便演示 }
千万记得要引入上面的include头文件!下面这个方法有没有似曾相识的感觉?对,就是.h文件里的方法,粘贴过来即可。有心的人就可以发现,只是加了一个参数名而已!(参数类型是不可以修改的,这是一个坑点,切记!)
6、还是在jni文件夹下创建一个Android.mk文件,放入如下代码:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MySo LOCAL_SRC_FILES := jnitest.c include $(BUILD_SHARED_LIBRARY)
7、黑窗口又来了..因为个人认为黑窗口方便才一直用的黑窗口..打开之后,进入工程的java目录下,敲入命令 ndk-build即可生成.so文件,如图:
坑点来了,生成完so文件之后,他会多出两个包,一个是libs,一个是obj包,复制libs里的文件夹,在main目录下创建一个文件夹,名为jniLibs,将复制的文件放入,然后删掉libs文件夹!删掉!
首次配置完成之后,他会报一个
解决办法如下:
在app的build.gradle的android下添加:
sourceSets.main { jniLibs.srcDir 'libs' jni.srcDirs = [] }
全部流程一直完成了,运行即可,最终效果如下(为了演示方便,就只做了一个方法):
这是一个入门演示,如有问题请指正,后期会改正,教程结束!