NDK之HelloWord!
使用工具: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!的更多相关文章
- Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)
1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...
- Android(java)学习笔记201:JNI之helloword案例(利用NDK工具)
1. 逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们 ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- Android NDK开发初步
在配置好NDK开发之后就能够使用C/C++开发android了.以下以一个HelloWorld项目来说明 1.新建一个Androidproject 新建一个HelloWorldproject 代码例如 ...
- linux下ndk编译命令行程序及配置
1.在http://developer.android.com/tools/sdk/ndk/index.html下载Android-ndk-r8e-linux-x86.tar.bz2,解压后把andr ...
- 安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord
目录 1.基础概念 ├──1.1.JNI ├──1.2.NDK ├──1.3.CMake与ndk-build 2.环境搭建 3.Native C++ 项目(HelloWord案例) ├── 3.1.项 ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- NDK开发_笔记0
自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...
- Android NDK debug 方法
最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...
随机推荐
- HASHMAP原理解析,不错的文章
http://blog.csdn.net/vking_wang/article/details/14166593
- SQLSERVER数据库置疑、可疑、脱机、单用户、紧急模式等的修复
数据库出现置疑.可疑.脱机.单用户.紧急模式主要是因为数据库的日志文件除了问题,2000和2008修复方式不一样,2008的修复脚本在2000中不适用,主要是不被2000识别. 假设数据库名为:eis ...
- 【跑马灯】纯css3跑马灯demo
我们写跑马灯一般都是用js控制定时器不断循环产生,但是定时器消耗比较大,特别是程序中很多用到定时器的时候,感觉有的时候比较卡.但是css3样式一般不会.这里主要的思路就是用css3代替js定时器实现一 ...
- UVALIVE 5096 Volume
This time your job is to calculate the volume of a special object. The object consists of two orthog ...
- Linux下进程描述(1)—进程控制块【转】
转自:http://www.cnblogs.com/33debug/p/6705391.html 进程概念介绍 进程是操作系统对运行程序的一种抽象. • 一个正在执行的程序: • 一个正在计算机上执行 ...
- 【MT8382/8121】为MTK的工厂测试添加测试项
摘要: 本文介绍添加MTK工厂测试项的步骤及调试技巧. 纲要: 1. 描述添加MTK工厂测试项的步骤 2.调试小技巧 1. 描述添加MTK工厂测试项的步骤 以添加红外测试为例: 1. mediatek ...
- 内核中的多点触摸协议文档 Multi【转】
转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Andr ...
- 【bzoj2561】最小生成树
嗯……这题是一个网络流. 加入的边为u,v长度L 则所有长度大于L的边不能使得u,v连通 求个最小割即可.小于同理 两次最小割结果相加. #include<bits/stdc++.h> # ...
- mysql 使用set names 解决乱码问题
引子: 最近查询公司线上表数据,返现在Xshell控制台打印的数据都是乱码,记得之前瞄过同事都是执行set names UTF8 , 解决的,特记录如下.
- 区块链开发(四)Nodejs下载&安装
以太坊框架truffle的安装需要依赖nodejs中的npm命令,本篇博客我们就简单介绍一下node的安装过程.操作系统基于ubuntu 16.04版本. 下载地址 nodejs官网:http://w ...