Android_Studio集成ndk开发流程

img1

今天来讲一下Android Studio集成ndk开发的流程及相应的一些配置,也算是留一个笔记,方便以后查阅。

整个流程大概分为以下几部分:

  1. 配置build.gradle让其支持ndk的编译
  2. 编写native方法及加载相应的so
  3. 手动编译c头文件
  4. 实现native方法
  5. 测试

1.配置build.gradle

1.先在build.gradle文件中配置

appbuild.gradle中的defaultConfig括号内添加以下代码:

ndk {
    moduleName "hardcontrol"          //生成的so名字
    abiFilters "armeabi", "armeabi-v7a", "x86" //指定编译的so库所支持的平台
    ldLibs "log"  //配置log库
    stl="system"  //系统默认最小支持的c++运行时库
    cFlags="-std=c++11"  //标记
}

此处配置就相当于我们配置了Android.mkApplication.mk这两个文件,由gradle自动帮我们构建,一般情况下我们只需要配置moduleNameabiFilters两个属性就可以了,最多加一个log库,可以在C中使用AnroidLog库来打日志,其它两项一般可能用不到。此处可以配置的属性都可以在NdkOptions中看到,按住command通过点击任意一个属性就可以进入。

2.在gradle.properties文件中配置

只需要配置一个参数即可:

android.useDeprecatedNdk=true

2.确认项目支持ndk环境

1.在project sturcture中查看是否已配置ndk环境:
img

2.在local.properties文件中查看相应配置:

ndk.dir=/Users/mac/Android/android-sdk-macosx/ndk-bundle

确认这两处都有配置。

3.编写native方法并调用so

public class HardControl {
    public static native int ledOpen();
    public static native void ledClose();
    public static native void  ledControl(int which,int status);

    static {
         //此处加载的lib库名,需要和build.gradle中配置的moduleName一致
        System.loadLibrary("hardcontrol");
    }
}

上面的例子中,我们编写了三个native方法,都是使用静态static修辞的,这样子可以直接通过类名.方法名来直接调用,如果不用static修辞也是可以的,那就需要创建对象来访问这些方法,和其它方法访问一样。

4.编译并生成头文件

上面的native方法编写完后,此时,我们需要先编译一下代码,使用clear Project或者build project都是可以的,目的是为了让其生成相对应的class字节码文件,然后,使用javah来生成头文件。

编译源码之后,在下面的路径中就能找到生成class字节码的文件。
img

此时,我们需要使用命令行进入到该目录,使用Android Studio中的terminal来执行操作。先用命令进行debug目录
img

然后使用javah命令来生成头文件

javah -jni com.example.mac.testled.hardControl.HardControl

这时需要注意的是:

  1. 包名路径需要使用.而不能使用/
  2. 选择要编译含有native方法的class文件,并且在编译时,不能带.class后缀。

执行上面命令成功后,会在debbug目录下生成头文件。

img

5.创建jni目录并编写native方法的c实现

直接使用Android Studio提供的创建方式:
img
然后将生成的头文件拷贝到jni目录下,此头文件是可以重命名的,一般我们会和其对应的c/cpp文件同名。

头文件就相当于我们java里的接口,我们还需要对头文件里的方法进行实现。可以使用c或者cpp文件来实现。我们的c或者cpp文件的方法名可以直接拷贝我们.h头文件中的方法名。

下面是我们的头文件中的方法声明:

img

我们可以直接把上面的三个方法声明拷贝到我们的c/cpp文件中,稍作修改即可。
img

接下来,我们在相应的方法体里面写入c代码即可。

7.测试

我们在ledOpen方法中打印了androidlog。现在通过调用ledOpennative方法来验证一下其效果。
img
直接调用该方法,执行后,在log区打印出来了相应的信息。
img

8.扩展

1.多文件多native方法的处理

意思是有多个文件中含有native方法的处理

9.Android Studio新特性

img