美文网首页
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的方法;

相关文章

  • Android JNI(一)——NDK与JNI基础

    一、什么是NDK NDK官网介绍 简单的来说: 二、为什么使用NDK 三、NDK到so的演变 从图中可知:我们上层...

  • NDK简单的使用

    1.开发编译环境 AndroidStudio 2.1.2SDK 23.0.3NDK 12.1.2977051 2....

  • NDK 重拾一下

    周末帮小弟弟看一个NDK的问题,回首又温习了一下NDK的部分知识,留个笔头。 1.新版AS中NDK 简单使用 新建...

  • Mac 下编译FFmpeg4.3.1

    需要使用NDK来编译FFmpeg,需要下载NDK和FFmpeg我使用的NDK版本:android-ndk-r21F...

  • Android NDK

    ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。ndk-build 使用 Androi...

  • ndk的配置及使用

    ndk 配置及使用 参考这个文章练习使用了一下ndk,基础的搭建这个博客说的很详细了,我就简单写一下中间可能没注意...

  • Android Studio NDK 示例

    本文是在mac环境,使用android studio完成ndk开发ndk安装在这里略过配置也比较简单 具体步骤 1...

  • android studio NDK简单使用

    首先集成ndk编译环境 配置 1.gradle.properties中加入android.useDeprecate...

  • 安装和简单使用NDK

    1、什么是NDK? JNI是为了方便Java调用C、C++等本地代码而封装的一层接口。NDK是一个工具集合,调用N...

  • Android NDK入门 —— CMake

    前言 我会在小专栏和简书一起分享。上篇说了入门一个NDK程序,大致讲解了如何简单的使用ndk-build。 正题 ...

网友评论

      本文标题:NDK简单的使用

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