NDK简单的使用

2018-10-28  本文已影响6人  Serenity那年
1.开发编译环境

AndroidStudio 2.1.2
SDK 23.0.3
NDK 12.1.2977051

2.NDK的安装与配置

首先创建一个Android项目工程,File-->New-->New Project,一路下一步就好,最后finish创建完成项目.
打开Project Structure,默认Android NDK location是没有的,这时候如果已经下载有了NDK,那你就可以直接选择下载好的NDK路径设置到输入框,否则点击download进行下载,下载完成后默认安装在sdk根目录,命名为ndk-bundle。


image.png

我的sdk路径为:/Users/serenitynanian/Library/Android/sdk
2.1 添加系统环境变量,新建变量名ANDROID_NDK_HOME,对应变量值为ndk根目录地址 ,如D:\android-sdk\ndk-bundle,然后将ANDROID_NDK_HOME添加到Path中去(%ANDROID_NDK_HOME%;),确定OK.
至此,会在项目的local.properties文件下添加ndk的目录地址,如果没有自动添加,可以收到加上一行:ndk.dir=/Users/serenitynanian/Library/Android/sdk/ndk-bundle,由于ndk版本和IDE的版本可能存在不一致性,所以编译时会检查ndk的过时性,这个时候如果报警了,可以在gradle.properties文件下添加一行:android.useDeprecatedNdk=true.到此,NDK的安装和配置就完成.

3.Native方法的创建

3.1 在java目录下的包中创建一个Hello类,类里面创建一个native方法,如下:

  /**
     * 由于当前版本的as暂时不支持c文件的连接和根据提示自动创建c方法,只有手动添加
     * 添加规则如下:
     * 来到terminal终端上,在app/java/目录下 输入 javah -d ../jni com.zcbl.client.zcblsdk.Hello 按下Enter
     * 那么会在java的上级目录也就是main目录下创建一个jni的文件夹,在文件夹下生成一个com_zcbl_client_zcblsdk_Hello.h
     * 的头文件;
     * 上面的com.zcbl.client.zcblsdk.Hello是native类中的全路径
     * @return
     */
    public static native String sayHello();
屏幕快照 2018-02-01 下午5.43.46.png

3.2 在jni目录里生成的com_zcbl_client_zcblsdk_Hello.h内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zcbl_client_zcblsdk_Hello */

#ifndef _Included_com_zcbl_client_zcblsdk_Hello
#define _Included_com_zcbl_client_zcblsdk_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_zcbl_client_zcblsdk_Hello
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_zcbl_client_zcblsdk_Hello_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

3.3 com_zcbl_client_zcblsdk_Hello的实现

#include "com_zcbl_client_zcblsdk_Hello.h"


JNIEXPORT jstring JNICALL Java_com_zcbl_client_zcblsdk_Hello_sayHello
  (JNIEnv * env, jclass jclass1){

    return env->NewStringUTF(" from native c");
  }

jstring:返回值类型;
Java_com_zcbl_client_zcblsdk_Hello_sayHello是实现的方法名,固定格式,Java_所要实现的方法名所在java类,将类的包名中的.用下划线替代_方法名(JNI环境变量 env,JNI环境对象 jobj);

3.4 Gradle配置,在app/build.gradle中加入你ndk 的moduleName,也就是生成.so的名字;

defaultConfig {
        ndk{
            //生成.so的名字 这个名字与native方法名没有关系
            moduleName "hello"
        }
    }

如上配置,然后编译,就会在app/build/intermediates/ndk/debug/lib目录下生成对应abi的.so文件

四、在类中使用native方法

4.1 首先需要在native类中添加一个静态代码块,如下:

package com.zcbl.client.zcblsdk;

/**
 * Created by serenitynanian on 2018/1/20.
 */

public class Hello {

    static {
        System.loadLibrary("hello");
    }

    /**
     * 由于当前版本的as暂时不支持c文件的连接和根据提示自动创建c方法,只有手动添加
     * 添加规则如下:
     * 来到terminal终端上,在app/java/目录下 输入 javah -d ../jni com.zcbl.client.zcblsdk.Hello 按下Enter
     * 那么会在java的上级目录也就是main目录下创建一个jni的文件夹,在文件夹下生成一个com_zcbl_client_zcblsdk_Hello.h
     * 的头文件;或者手动创建;
     * 上面的com.zcbl.client.zcblsdk.Hello是native类中的全路径
     * @return
     */
    public static native String sayHello();
}

4.2 在java方法中调用,如下:

Hello.sayHello()

上面就会调用native的方法;

上一篇下一篇

猜你喜欢

热点阅读