ndk 入门实例

简介: 引用:http://zctya.blog.163.com/blog/static/1209178201181074018603/ 目标: 利用NDK 生成 SO 库,使用 SO 库进行 JNI 调用,在 Android sdcard 创建文件并写入数据。

引用:http://zctya.blog.163.com/blog/static/1209178201181074018603/

目标:

利用NDK 生成 SO 库,使用 SO 库进行 JNI 调用,在 Android sdcard 创建文件并写入数据。
工具:NDK 1.6 、Eclipse for java 、android SDK 、Cygwin

一、下载  Cywin
从Cywin官网 
http://www.cygwin.com/ 下载所需要的版本,这里仅介绍在Windows下使用  Cywin
二、下载 NDK 
这个直接从Android 官网下载就好了,现在不用FQ了。
www.android.com
三、安装 Cywin 参考 【eoe特刊】第七期:NDK.pdf 大家可以去看这个PDF
下载到的Cywin 的程序文件为 setup.exe 文件 
1、双击这个文件,启动安装
NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog
2、下一步

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
3、在线安装

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
4、选择安装路径

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog

 
5、下载文件缓存路径

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
6、选择网络连接方式

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
7、选择下载镜像站点,目前有一个最新的镜像是163.com,大家选择这个速度快,网易提供的源

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
8、下载安装

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog

 
9、选择安装项

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
10、启动 Cywin 测试 

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
11、输入命令测试

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
四、配置Cywin
先找到安装路径下的 .bash_profile 文件,
我的环境位于:

2.修改 /home/$your computer's login name$/.bash_profile 在其中添加下面两句

 # 这个里面的f/Android/android-ndk-r6b是存放NDK的目录,我的是F盘下Android文件夹中的android-ndk-r6b文件夹就是NDK的目录
ANDROID_NDK_ROOT=/cygdrive/f/Android/android-ndk-r6b
# 你懂的
export ANDROID_NDK_ROOT

    其中前一句需要修改为你自己的路径,保存后,重新启动 Cygwin 。 注意:这里如果是中文 OS 使用记事本或者写字板打开编辑后,重新启动 Cygwin 会报错。
五、编译NDK实例( hello-jni),测试一下
我们使用NDK自带的一个例子来生成.so文件
生成 .so 的步骤 ①、在Cywin中,首先跳转到NDK实例目录下面,

 cd /cygdrive/f/Android/android-ndk-r6b//samples/hello-jni/

②、执行下面的命令

$ANDROID_NDK_ROOT/ndk-build

    等待片刻,就会有提示

 # $ANDROID_NDK_ROOT/ndk-build
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Gdbsetup : libs/armeabi/gdb.setup
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so

    此时.so文件生成成功
六、现在我们来写一个自己的程序来试一下.so,本人使用1.6以上版本 
1.用Eclipse 创建一个Android程序,MyNDK

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 


2. 

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
3.

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
4.

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
5 生成 JNI  头文件

下面生成JNI 头文件啦,使用 javah 命令,对 JNI..java 这个文件生成,别搞错啦!

使用cmd 进入 android 项目的 bin 目录中,然后执行  javah -classpath .  -jni cc.androidos.jni.JNI 这个命令。别忘记包名!( ^_^


NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
生成了一个cc_androidos_jni_JNI.h

打开看看:(里面都是c 语言的头文件声明)  
NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog

 6.书写C 代码,写入数据

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
com_zctya_jni_MyJni
.h内容不变
  com_zctya_jni_MyJni.c的内容

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 


在这里的代码会在运行的时候向sdcard 写入 12530文件夹中的bj12530.log文件中写入 数据”
aaaa“。
7.  编译SO 文件

在NDK的主目录 android-ndk-r6b 下面有个 sources 文件夹中创建一个名为 myndk 的文件夹
不知道这里是为什么与网上的介绍不太一样

我这里需要在 myndk 文件夹下面再创建一个名为 jni 的文件夹,文件夹中有如下三个文件

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 

这里的Android.mk文件中的内容如下

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog
 
执行过程中
NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 
执行后,结果如 

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 

8、把生成的so库,放到Android 工程下面
NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog

  
把 libs 文件夹,复制到 android中MyNDK工程的主目录

9、启动模拟器测试:注明这里的12530文件夹和bj12530.log文件是原来创建好的

这里还有个疑问为什么别人用 make APP=××× -B 之类的就可以通过,而我就不行呢,郁闷中...,还望知者赐教

 

 

 

[  make APP=××× -B 是NDK1.4之前的版本  

附相关源码:

NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog 

http://u.115.com/file/bhixb5c3 NDK_demo.rar

相关文章
|
11月前
|
安全 NoSQL 网络协议
SSRF内网打穿相关姿势
本文详细介绍了服务器端请求伪造(SSRF)漏洞,包括其定义、漏洞场景、常见漏洞函数、URL伪协议及其利用方法。通过具体的靶机示例,展示了如何利用SSRF漏洞进行内网探测、命令执行、SQL注入、命令注入、XXE注入、Tomcat任意文件上传和Redis未授权访问等攻击。文章还提供了相关工具和参考资料,帮助读者更好地理解和应对SSRF漏洞。
604 0
SSRF内网打穿相关姿势
|
关系型数据库 MySQL Linux
在CentOS上使用yum安装与使用MySQL
在CentOS操作系统上使用yum包管理器安装和配置MySQL数据库的详细步骤,包括下载MySQL的yum源配置、安装MySQL服务、启动和停止服务、设置开机自启动、获取临时密码、修改root用户密码、授权用户以及处理相关问题。同时,文章还包含了一些操作的截图,帮助用户更直观地理解安装和配置过程。
3419 0
在CentOS上使用yum安装与使用MySQL
|
SQL 缓存 关系型数据库
Mysql跨库操作
Mysql跨库操作
368 0
|
机器学习/深度学习 人工智能 NoSQL
人工智能平台PAI产品使用合集之机器学习PAI EasyRec训练时,怎么去除没有意义的辅助任务的模型,用于部署
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
C++
一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下再反弹,求它在第10次落地时共经过多少米,第10次反弹多高。
这段内容包含两部分:代码示例和两个图片。代码是一个C++程序,主要逻辑是循环10次,每次迭代中更新变量x和y的值。图片似乎显示了代码执行前后的结果,但具体细节无法在摘要中体现。
149 0
|
Linux
Linux使用dd命令进行数据备份
Linux使用dd命令进行数据备份
408 0
|
编解码 算法 搜索推荐
AIGC在天猫商品海报生成上的探索
AIGC在天猫商品海报生成上的探索
418 0
|
Web App开发 资源调度 算法
【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
378 1
|
SQL Oracle 关系型数据库
MySQL练习3——查询及结果去重
MySQL练习3——查询及结果去重!