Android NDK基本使用:

开始之前

要了解一个新事物,无非就是三件事:是什么,为什么,怎么用

NDK简介

(英语:native development kit,简称NDK)是一种基于原生程序接口的软件开发工具。通过此工具开发的程序直接以本地语言运行,而非虚拟机。因此只有java等基于虚拟机运行的语言的程序才会有原生开发工具包。

1.NDK是一系列工具的集合

NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的.

2.NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

3.NDK包括了:

1.从C / C++生成原生代码库所需要的工具和build files。
2.将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
3.支持所有未来Android平台的一系列原生系统头文件和库

JNI

Java Native Interface(JNI)标准是java平台的一部分,JNI是Java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用C/C++代码,C/C++的代码也可以调用java代码。

JNI与NDK的关系

NDK可以为我们生成了C/C++的动态链接库,JNI是java和C/C++沟通的接口,两者与android没有半毛钱关系,只因为安卓是java程序语言开发,然后通过JNI又能与C/C++沟通,所以我们可以使用NDK+JNI来实现“Java+C”的开发方式。

为什么要使用NDK

1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

上面的铺垫就到这了,接下来具体看看如何进行NDK开发

开发前的准备

NDK的下载
这里写图片描述

安装完成后我们刷新Project,进local.properties文件查看也能看到SDK与NDK的路径。
这里写图片描述

NDK下载配置完成之后,需要在gradle.properties文件中加上一行:

android.useDeprecatedNdk=true

JAVA(JDK)环境变量配置(若配置不好,则在下面的配置中找不到javah.exe)
http://blog.csdn.net/wubihang/article/details/53084276

NDK环境变量
安装好的NDk一般位于你的sdk文件夹下的ndk-bundle。可以看到里面有ndk-build文件,下文进行编译的时候我们会用到。然后将该路径配置到你系统变量的path里面去,如下:
1、在系统环境变量里面创建NDK_ROOT

这里写图片描述

2、将NDK_ROOT追加到Path环境变量下–>;%NDK_ROOT%

添加完毕后打开cmd,输入ndk-build,出现如下内容则表示成功(网上说是成功的,虽然显示的貌似是一些错误信息,但是后文运行的时候是没问题的可以编译成功)。

这里写图片描述

接下来,我们借助强大的Android Studio的插件功能,在External Tools下配置两个非常有用的插件。进入Settings–>Tools–>ExternalTools,点击+号增加。

这里写图片描述

这里写图片描述

javah
-jni命令,是根据java文件生成.h头文件的,会自动根据java文件中的类名(包含包名)与方法名生成对应的C/C++里面的方法名。下面是参数配置及其含义:
1. Program: JDKPath \bin\javah.exe 这里配置的是JDK目录下的javah.exe的路径。
2. Parametes: -classpath . -jni -d ModuleFileDir /src/main/jni FileClass
这里 FileClass 指的是要执行操作的类名(即我们操作的文件), ModuleFileDir /src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
按照图中的配置,因为CSDN的编辑器问题,一些$符号出不来,这块注意下
使用方式:选中java文件—>右键—>External
Tools—>javah-jni,将生成jni文件夹以及文件夹下的 包名.类名的.h头文件 (名字过长,我们可以自己重命名)。

这里写图片描述

ndk -build命令,是根据C/C++文件生成so文件的。下面是参数配置及其含义:
1. Program: D:\Android\sdk\ndk-bundle\ndk-build.cmd 这里配置的是ndk下的ndk-build.cmd的路径(根据实际情况填写)。
2. Working: ModuleFileDir \src\main\
按照图中的配置,因为CSDN的编辑器问题,一些$符号出不来,这块注意下
使用方式:选中C/C++文件—>右键—>ExternalTools—>ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。

准备工作做完了,那么我们就来个简单的加法运算

1、先建一个类,写上如图所示的,报红的先不会理会

这里写图片描述

public class Test {

    public native int add(int a,int b);

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

2、然后对该文件执行javah -jni操作,生成对应的.h头文件。

这里写图片描述

这里写图片描述

3、接着自己在jni文件夹下建立一个.c文件,内容如图所示的

这里写图片描述

#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include "com_dabin_lianxi_Test.h"


JNIEXPORT jint JNICALL Java_com_dabin_lianxi_Test_add
  (JNIEnv *env, jobject thisz, jint a, jint b){
    return a+b;
  }

4、还得在jni文件夹下建立一个Android.mk的文件,内容如图所示

这里写图片描述

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := Dabinmo
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)

5、接下来就要生成.so文件了,如图所示

这里写图片描述

6、完成后生成一个libs包和obj包

这里写图片描述

7、现在就可以再MainActivity中调用了

这里写图片描述

8、点击运行,会出现如下的错误

这里写图片描述

9、进行修改,在app的build.gradle中的添加如图所示的代码

这里写图片描述

 sourceSets.main {
        jni.srcDirs = []
    }

10、sync now后再次运行,程序还会出错,如下图错误
这里写图片描述

11、接下来这波操作很关键了,先在main文件夹下新建jniLibs的文件夹,把自动生成的libs中的所有文件复制到jniLibs中,再删除掉libs文件夹。

这里写图片描述

删除后的

这里写图片描述

12、然后点击运行

这里写图片描述

这就是一个简单的操作整体的流程。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值