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 = []
}

全部流程一直完成了,运行即可,最终效果如下(为了演示方便,就只做了一个方法):


这是一个入门演示,如有问题请指正,后期会改正,教程结束!