使用工具: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. Hibernate中inverse、cascade的说明

    一: 前沿:刚刚学习hibernate时,对于inverse很是纠结,不知道什么时候该用什么时候不该用,在网上找了一些资料,说的也很含糊,我都不知道如果写了"inverse=true&quo ...

  2. 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]

    Problem b Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...

  3. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

  4. [bzoj3343]教主的魔法——分块

    Brief description 给定一个数列,您需要支持一下两种操作: 给[l,r]同加一个数 询问[l,r]中有多少数字大于或等于v Algorithm analyse 这个题一时想不到什么有效 ...

  5. vue this.$router.push 页面不刷新

    解决办法: 使用 watch,观察路由,发生变化重新获取数据 <script> export default { data() { return { data: {} } }, metho ...

  6. bzoj 1433 二分图匹配

    裸地匈牙利或者最大流,直接匹配就行了 需要注意的是(我就没注意细节WA了好多次...) 每个人和自己之间的边是0,但是应该是1 不是在校生是没有床的.... /******************** ...

  7. 让VC6.0编译出来的程序支持XP样式或XP风格

    (1)VC6.0编译出来的win32程序不支持winxp样式的原因:微软WINXP系统更新了Comctl32.dll(ver 6.0)这个“XP风格”的控件.为了保留传统的Windows界面风格,特地 ...

  8. python Fielddata is disabled on text fields

    # 执行https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html中的例子时报错F ...

  9. Android源码的BUG

    在Android系统移植过程中,遇到很多源码上的BUG.但是我们看到市面上都是没有这些问题的.难道这些BUG在每个开发商都要经历一次解BUG的过程吗?Android释放的源码是否是最新的?暂时没有想法 ...

  10. React 踩坑记录

    1.React-router error: super expression must either be null or a function 原因:引入babel后写ES6风格的代码: class ...