NDK 配置及简单项目

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50998720 文章出自:薛瑄的博客

你也能够查看我的其它同类文章,也会让你有一定的收货!

NDK 下载与配置:

Android Studio 从 1.3 版本号開始加入了 NDK 支持(见 Android NDK Preview),所以须要使用 NDK 的话,需更新到 >=1.3 的版本号。本文中使用的是 2.1 版(写此文时最新版)。


两种方法:

第一种:

Android Studio 自带的 SDK 管理器下载 NDK ,如今尽管 谷歌被墙,可是感觉更新下载这些开发工具还算流畅。

这里写图片描写叙述
图一

安装NDK,才会在下图中显示install,并在有更新时提示:

这里写图片描写叙述
图二

另外一种:

1、能够单独下载(可在 这里 下载或者在官网下载,这里下载历史版本号),然后解压就能够了
2、在以下的位置填入NDK的路径:

这里写图片描写叙述
图三

配置完后。会在local.properties出现例如以下代码:

ndk.dir=D:\Android\android-ndk-r10

手动下载的时候。NDK有zip和exe两种。我觉得它们的差别是。下载zip,直接解压后使用,是没有在图二中显示install,而且不能提示更新。


第一个NDK项目

參考:
http://yanbober.github.io/2015/02/14/android_studio_jni_1/
http://blog.csdn.net/qiujuer/article/details/42040963

1、建立新项目 NDKDemo并新建2个类

由于仅仅有一个类。生成好jni文件,编译总是会出现以下的报错。不知为何(详情參见NDK在Windows的一个bug),两个类,生成号jni文件,就能够正常执行!

make.exe: *** No rule to make target `F:StudioProjectsNDKTest2appuildintermediates
dkdebugobj/local/armeabi-v7a/objs/JniDemo/F_StudioProjectsNDKTest2appsrcmainjni', needed by `F:StudioProjectsNDKTest2appuildintermediates
dkdebugobj/local/armeabi-v7a/objs/JniDemo/F_StudioProjectsNDKTest2appsrcmainjnicom_example_xue_ndktest2_MathKit.o'.  Stop.


Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:Androidandroid-ndk-r10
dk-build.cmd'' finished with non-zero exit value 2

这里写图片描写叙述

在 MathKit 中我们实现计算 INT 值的平方数。

public class MathKit {  
    public static native int square(int num);  
} 

StringKit 这个类什么功能也没有,充数的:

public class StringKit {  
    public static native void setNull(String str);  
} 

2、准备 .h 文件

有两种方式。建议掌握第一种就可以:

第一种:

  1. 进入NDKDemo项目的Java目录。
  2. CMD 进入该目录进行 javah 操作(可按住shift点击鼠标右键->在此处打开命令窗体):
    这里写图片描写叙述

注意。一定要在项目project的java目录。后面输入的完整包名net.qiujuer.ndkdemo.jni.MathKit(不一定要和这个包名一模一样)

有的朋友可能知道,java在编译文件时。会将包名转为路径。以为这里仅仅要掌握好执行输入javah命令的路径输入的包名就可以。事实上不然,请看下图(我自己又一次建立项目,所以包名和上图不一样)
这里写图片描写叙述

另外一种:

1、build ->make modules得到中间文件,我们关注的是.class文件。
2、编译OK以后生成的class文件在ASproject的例如以下目录: appuildintermediatesclassesdebug。

3、然后接下来的步骤就是依据生成的class文件。利用javah 生成相应的 .h头文件。


4、点开AS的Terminal标签,默认进入到该项目的app目录下。我在windows平台下输入例如以下命令跳转到class中间文件生成路径:

xxxxxapp> cd buildintermediatesclassesdebug

5、然后执行例如以下javah命令生成h文件。

xxxxxdebug> javah -jni net.qiujuer.ndkdemo.jni.MathKit

6、执行完之后你能够在目录appuildintermediatesclassesdebug下看见生成的 .h头文件为:

net_qiujuer_ndkdemo_jni_MathKit.h

3、建立jni目录:

这里写图片描写叙述

也可手动建立new->Directory,目录命名为jni就可以。

4、拷贝.h文件到jni目录并建立.cpp文件

1、拷贝第二步生成的.h文件到jni目录
2、新建.cpp文件,操作例如以下图:

这里写图片描写叙述

分别实现:

net_qiujuer_ndkdemo_jni_MathKit.cpp

#include <net_qiujuer_ndkdemo_jni_MathKit.h>  

JNIEXPORT jint JNICALL Java_net_qiujuer_ndkdemo_jni_MathKit_square  
  (JNIEnv *env, jclass cls, jint num)  
  {  
        return num*num;  
  }  

net_qiujuer_ndkdemo_jni_StringKit.cpp

#include <net_qiujuer_ndkdemo_jni_StringKit.h>  

JNIEXPORT void JNICALL Java_net_qiujuer_ndkdemo_jni_StringKit_setNull  
  (JNIEnv *env, jclass obj, jstring str)  
  {  

  }

这里写图片描写叙述

5、设置 APP 项目 build.gradle

设置生成的Jni名称为:JniDemo

这里写图片描写叙述

在 MathKit 类中加入载入so库的代码

public class MathKit {  
    public static native int square(int num);  

    static {  
       //载入JniDemo库
        System.loadLibrary("JniDemo");  
    }  
} 

在StringKit 类中加入载入so库的代码

public class StringKit {  
    public static native void setNull(String str);  
    static {  
       //载入JniDemo库
        System.loadLibrary("JniDemo");  
    }  
} 

6、主文件调用:

这里写图片描写叙述

到此完美结束。能够看看执行结果:
这里写图片描写叙述

很多其它

在平时的那些操作中我们不可避免的要建立:
Android.mk

LOCAL_PATH      := $(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_MODULE    := genius  
LOCAL_SRC_FILES := net_qiujuer_imageblurring_jni_ImageBlur.cpp  
LOCAL_LDLIBS    := -lm -llog -ljnigraphics  

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_ABI     := all  
APP_PLATFORM:= android-19  
APP_OPTIM   := release  

而这里这两个文件都没有建立,那么是怎么决定的呢?

我们能够在 ndk 的 modelName 上按住 Ctrl 进行点击将会出现这个界面:

这里写图片描写叙述

这些就是所有能够设置的參数。分别相应:

ndk{  
    moduleName "JniDemo" // 设置生成的文件名称  
    cFlags "-DANDROID_NDK -D_RELEASE" //这个相应的是生成模式  
    ldLibs "m", "log", "jnigraphics" //这个相应 LOCAL_LDLIBS 可是须要去掉前面的 “l”  
    abiFilters "all" //这个是相应的 APP_ABI  
    stl "stlport_shared" //这个相应的是 APP_STL   
}  

本项目原作者的下载地址

參考:
http://blog.csdn.net/sbsujjbcy/article/details/48469569
http://www.androiddevtools.cn/

原文地址:https://www.cnblogs.com/llguanli/p/7387887.html