美文网首页
NDK简单的使用

NDK简单的使用

作者: Serenity那年 | 来源:发表于2018-10-28 21:31 被阅读6次
    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的方法;

    相关文章

      网友评论

          本文标题:NDK简单的使用

          本文链接:https://www.haomeiwen.com/subject/klodzxtx.html