使用工具:Android Studio 2.2.2

1. 配置local.properties添加NDK路径。

  

效果:当然,你也可以手输写进去。

2. 项目gradle.properties追加

android.useDeprecatedNdk=true

3. 创建jni文件夹

效果:

OK,开始写代码咯

4. 编写Java层引用native的代码

5. 生成与之对应的.h头文件

5.1 进入java的文件夹下

5.2 javah命令生成.h文件,记得带上完整的包名。

5.3 将.h文件剪切到jni文件夹下

5.4 编写与之对应的C文件

#include <jni.h>
#include <com_example_lanhe_android_jnistringdemo_jni_HelloWorld.h> JNIEXPORT jstring JNICALL Java_com_example_lanhe_1android_jnistringdemo_jni_HelloWorld_getHelloWorld
(JNIEnv *env, jobject thiz){ return (*env)->NewStringUTF(env, "Hello Jni");
}

5.5 cpp文件夹下添加Android.mk 文件

Android.mk: 直接复制,再此基础上改就好了。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloWorldLib
LOCAL_SRC_FILES := com_example_lanhe_android_jnistringdemo_jni_HelloWorld.c include $(BUILD_SHARED_LIBRARY)

6. build.gradle 配置ndk

ndk {
//这里的模块名称要对应之前的名称
moduleName "HelloWorldLib"
//生成对应硬件平台的so
abiFilters "armeabi","arm64-v8a","armeabi-v7a", "x86"
}

7.测试使用

效果:

题外话:

1.发生了如下错误:

http://tools.android.com/tech-docs/new-build-system/gradle-experimental.Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\AndroidDevelopmentTools\android-ndk-r10b\ndk-build.cmd'' finished with non-zero exit value 2

解决方法:在cpp文件夹下追加一个empty.c

2.发生了如下错误:

Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: Error while executing 'D:\AndroidDevelopmentTools\android-ndk-r10b\ndk-build.cmd' with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:\workspace\workspace_AndroidStudio\JNIHelloWorldDemo\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-24 NDK_OUT=D:\workspace\workspace_AndroidStudio\JNIHelloWorldDemo\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=D:\workspace\workspace_AndroidStudio\JNIHelloWorldDemo\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi-v7a,armeabi,arm64-v8a,x86}

解决方法:把项目的build.gradle的版本改低一点。(不怎么推荐)

3.错误描述如下:

Error:(7, 3) opening dependency file D:\workspace\workspace_AndroidStudio\JNIHelloWorldDemo\app\build\intermediates\ndk\debug\obj/local/armeabi-v7a/objs/hello/D_\workspace\workspace_AndroidStudio\JNIHelloWorldDemo\app\src\main\jni\com_example_lanhe_android_jnihelloworlddemo_helloworld_HelloWorld.o.d: No such file or directory

解决办法:.h的文件名称太长了,把它放到外层目录,剪短它的长度。重新设置.h文件。

原来是工程结构的目录太深,android stuido 无法找到并创建so 文件build时的临时目录。只要将工程目录深度减少一 两级时就可以正常编译。

参考资料:

http://blog.csdn.net/qq_30379689/article/details/52590189

http://www.aichengxu.com/view/79290

NDK之HelloWord!的更多相关文章

  1. Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)

    1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...

  2. Android(java)学习笔记201:JNI之helloword案例(利用NDK工具)

    1. 逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们 ...

  3. Android NDK开发初识

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...

  4. Android NDK开发初步

    在配置好NDK开发之后就能够使用C/C++开发android了.以下以一个HelloWorld项目来说明 1.新建一个Androidproject 新建一个HelloWorldproject 代码例如 ...

  5. linux下ndk编译命令行程序及配置

    1.在http://developer.android.com/tools/sdk/ndk/index.html下载Android-ndk-r8e-linux-x86.tar.bz2,解压后把andr ...

  6. 安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

    目录 1.基础概念 ├──1.1.JNI ├──1.2.NDK ├──1.3.CMake与ndk-build 2.环境搭建 3.Native C++ 项目(HelloWord案例) ├── 3.1.项 ...

  7. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  8. NDK开发_笔记0

    自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...

  9. Android NDK debug 方法

    最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...

随机推荐

  1. PHP设计模式-工厂模式、单例模式、注册模式

    本文参考慕课网<大话PHP设计模式>-第五章内容编写,视频路径为:http://www.imooc.com/video/4876 推荐阅读我之前的文章:php的设计模式 三种基本设计模式, ...

  2. [洛谷P1074] 靶形数独

    洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...

  3. BZOJ 2095: [Poi2010]Bridges

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 869  Solved: 299[Submit][Stat ...

  4. [bzoj3876][AHOI2014]支线剧情——上下界费用流

    题目 传送门 题解 建立s和t,然后s向1连下限0上限inf费用0的边,除1外所有节点向t连下限0上限inf费用0的边,对于每条边下限为1上限为inf费用为经过费用,然后我们只有做上下界网络流构出新图 ...

  5. 热安装NGINX并支持多站点SSL

    https://www.moonfly.net/801.html http://www.centoscn.com/image-text/config/2015/0423/5251.html 1.查看n ...

  6. springmvc对于前台date类型注意点

    springmvc,可以自动将数据注入到: “name”值相同,便注入,比如String Integer 还有我们自定义的bean,比如User. 但是date类型的数据,如果前台传的是用" ...

  7. 新手学习selenium路线图(老司机亲手绘制)-学前篇【转载】

    前言: 本来这篇是只在微信公众号(yoyoketang)上发布的,最近一搜,发现本很多人copy(copy公众号的,图片是加载不出来的)了,还没注明出处,不想多说什么,博客上也同步更新这篇吧! 最近群 ...

  8. KVM(五)libvirt 介绍

    1. Libvirt 是什么 为什么需要Libvirt? Hypervisor 比如 qemu-kvm 的命令行虚拟机管理工具参数众多,难于使用. Hypervisor 种类众多,没有统一的编程接口来 ...

  9. Django组件之contenttype的应用

    contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建了新的model并执行数据库迁移后,Conte ...

  10. Laravel跳转回之前页面,并携带错误信息

    用Laravel5.1开发项目的时候,经常碰到需要携带错误信息到上一个页面,开发web后台的时候尤其强烈. 直接上: 方法一:跳转到指定路由,并携带错误信息 return redirect('/adm ...