zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    (转) 一步一步学习ASP.NET 5 (五)- TypeScript
    #一周五# win10通用平台,无处不在的Xamarin,msbuild开源,MVP卢建晖的Asp.NET 5系列 (视频)
    (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性
    (转) 一步一步学习ASP.NET 5 (三)- 认识新的Web结构
    #winhec# 开发人员刷屏看点 (视频)
    (翻译) TFS源代码控制的未来 (TFSVC vs. Git)
    (转) 一步一步学习ASP.NET 5 (二)- 通过命令行和sublime创建项目
    【JS教程03】函数
    【JS教程02】变量、数据类型及基本语法规范
    【JS教程01】JavaScript介绍与页面嵌入方式
  • 原文地址:https://www.cnblogs.com/llguanli/p/7387887.html
Copyright © 2011-2022 走看看