Android中NDK的搭建及简单使用 Android.mk相关介绍 JNI的使用
Android中NDK的搭建及简单使用:
使用NDK,简述其重要步骤:
、搭建NDK环境(作用:用于自动生成jni下的.c对应的so文件)---到Android NDK官网或Android官网下载ndk包,环境搭建步骤具体参看http://www.cnblogs.com/yejiurui/p/3476565.html
2、以eclipse为例,在com.test下创建Test2.java文件,会自动在项目的bin\classes\下生成相应的.class文件【若在项目中看不到,则可能当前在eclipse中
查看的是Package Explorer,切换到Navigator即可】如图

3、使用命令行切换目录至bin\classes\下,执行javah com_test_Test2,在该目录下生成对应的.h文件
4、在项目根目录下创建名为jni的文件夹(必须为jni),将上述3中生成的.h文件复制到该目录下
5、创建同名的.c文件com_test_Test.c,实现具体的在Test2.java中声明的native方法
6、在jni下创建文件Android.mk,配置具体生成so文件的信息,例如:名称、依赖的源文件(.c)
注意:若有同个.c文件则可以生成一个so文件或分别生成各自的so文件
(1)若生成一个so文件,以空格或Tab键隔开不同的源文件,换行使用 \ ,在Android.mk中信息格式为:
LOCAL_SRC_FILES := com_test_Test2.c com_test_TestNoNDK.c
换行: LOCAL_SRC_FILES := com_test_Test2.c \ com_test_TestNoNDK.c
如图:
(2)若生成不同的so文件,则需要以以下格式为模块:
include $(CLEAR_VARS)
LOCAL_MODULE := TestNDK #生成的so文件的名称
LOCAL_SRC_FILES := com_test_Test2.c #源文件
include $(BUILD_SHARED_LIBRARY)
如图:
7、上述完成后,会发现在项目的libs目录下有对应的so生成,整个结构如图:

8、在项目中使用时,需要先静态加载库文件
static{
System.loadLibrary("TestNDK");
}
9、加载完成之后,在项目中直接通过类名调用相应的方法即可(因都是静态方法)
上述仅是按照自己的理解简要总结的ndk使用的步骤,详细步骤可参看:http://www.cnblogs.com/yejiurui/p/3476565.html
补充:
Android.mk:
关于mk语法讲解:http://www.cnblogs.com/wainiwann/p/3837936.html
Android.mk中常用的属性含义:http://www.cnblogs.com/welhzh/p/4532142.html
个别含义:
LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
------
JNI的使用场景:
简单的说:JNI是Java平台定义的用于和宿主平台上的本地代码进行交互的“Java标准”,它通常有两个使用场景:
1.使用(之前使用c/c++、delphi开发的)遗留代码;
2.为了更好、更直接地与硬件交互并获得更高性能。
Android中NDK的搭建及简单使用 Android.mk相关介绍 JNI的使用的更多相关文章
- Android中XML格式数据的简单使用
源码: package com.wangzhu.demo; import java.io.IOException; import java.io.StringWriter; import javax. ...
- Android中两个Activity之间简单通信
在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...
- Android开发学习总结——搭建最新版本的Android开发环境
原文出自:https://www.cnblogs.com/xdp-gacl/p/4322165.html#undefined 最近由于工作中要负责开发一款Android的App,之前都是做JavaWe ...
- Android中隐藏顶部状态栏的那些坑——Android开发之路3
Android中隐藏顶部状态栏的那些坑 先看看常规的隐藏状态栏的方法: 方法一: @Override protected void onCreate(Bundle savedInstanceState ...
- 在Android中Intent的概念及应用(二)——Intent过滤器相关选项
一.如果多个Activity拥有同一个Intent Action,启动时用同一个Action启动会是什么情况? 如何指定某一个Activity启动? 在多个Activity拥有同一个Intent Ac ...
- Android中GridView拖拽的效果【android进化三十六】
最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的 ...
- Android笔记(二十九) Android中的异步更新(一) Android中的线程
Java中的线程 1. 线程的两种实现方式 ①继承Thread类 ②实现Runnable接口 两者区别在于,Thread这个类的对象,代表的是一个线程,而Runnable的对象,代表的是线程体(也就是 ...
- Android中FTP服务器搭建入门
http://www.2cto.com/kf/201501/374048.html http://blog.csdn.net/smile3670/article/details/44343617 有 ...
- Android 新版NDK环境搭建(免Cygwin)
使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配 ...
随机推荐
- HTTP、TCP、UDP以及SOCKET之间的区别/联系
一.TCP/IP代表传输控制协议/网际协议,指的是一系列协组. 可分为四个层次:数据链路层.网络层.传输层和应用层. 在网络层:有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在 ...
- js中的一些容易混淆的方法!
数组的一些方法: 1.join()和split()方法 与之相反的是split()方法:用于把一个字符串分割成字符串数组. 注意返回的数组中不包括separator本身: 提示和注释注释:如果把空 ...
- No edit session in the progress
运行环境:开发环境:Windows7旗舰版64bit.VisualStudio2008 With SP1.ArcEngine10.0.NetFrameWork4.0.IIS7和C#开发语言. 问题描述 ...
- sql 将8位字符串转换成日期型
将8位字符串转换成日期型,方法如下: ),)
- <停车位>version1.0
<停车卫> 产品需求说明书 文档版本号: Version 1.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...
- ASP数组全集,多维数组和一维数组[转]
ASP数组是比较好用的装载大量数据的容器.1 定义数组 有两种方式:DIM和REDIM. DIM定义的是固定个数.数据类型的数组:而REDIM则不同,它可以定义不同类型的数据,也可以定义个数并非固定的 ...
- 引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。
引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 需要在web.config增加配置 <startup use ...
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/16330267 在上一篇文章中,我带着大家一起剖析了一下LayoutInflater ...
- 【jquery】flexiGrid新增功能的方式
到目前为止,我用过的jquery表格插件只有jqGrid和flexiGrid.今天,只说后者. 关于参数配置,使用方法,博客园文章很多. 原生的flexiGrid架包不大,内容可以扩展,比如在每行数据 ...
- 由Selenium1转变为Selenium2所遇到的问题
1.使用ant脚本运行测试,报NoClassDefError,但使用junit方式运行或debug,都没有错误. 原因:找不到包,但具体是哪个包,不清楚:且为何使用junit方式运行就没有问题,也不清 ...