- 浏览: 661537 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ZHOU452840622:
少了一个构造函数 晕
Android画图之Matrix(一) -
ZHOU452840622:
06-30 17:39:19.193: E/AndroidRu ...
Android画图之Matrix(一) -
ZHOU452840622:
为什么报错哦
Android画图之Matrix(一) -
悬空90:
只是获取activity的名字而已, 没有实例。 反射 ...
获取屏幕上正在显示的activity -
night_iv:
重写下面两个函数EditText完全作废,点击没有反应没有光标 ...
Android自由选择TextView的文字
网上也有一些对NDK的介绍,不过都是很简单的把sample里面的例子讲解一下,并不深入,我这里把我的所得分享一下。我下载的是Android Native Developer Kit (NDK) R4版本,当前的最新版。
下载地址如下:
http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip
我下面讲的都是以linux环境为准,因为我的系统是linux的。windows下可以弄个Cygwin,模拟linux环境,网上有很多介绍。
首先进入ndk目录,有个README文件,里面提到了API的文档在docs/STABLE-APIS.TXT里面,如何安装NDK,参考docs/INSTALL.TXT,还有如何使用NDK,参考docs/HOWTO.TXT。建议这些文档都看一遍,有个大概了解。
安装:
INSTALL.TXT里面讲的是如何安装,安装NDK,就需要一个可以make环境,linux自带了,所以不用关心。还有一点,以前的版本都需要运行build/host-setup.sh来进行初始化,这个版本把它删除了,这样更方便。
然后就是配置环境变量。
在~/.bashrc文件里面,添加
NDK_ROOT=~/android-ndk-r4b #后面的路径是NDK所在的目录,根据自己的目录修改 export NDK_ROOT
然后保存,重新打开bash。
使用:
先拿sample试刀吧,刚开始什么都不知道,只有运行出一个例子,才能增加信心。
编译的两种方法:
1.进入要目标工程目录,比如$NDK_ROOT/samples/hello-jni,然后执行$NDK_ROOT/ndk-build
2.在任何地方,执行$NDK_ROOT/ndk-build -C $NDK_ROOT/samples/hello-jni.
如果成功的话,会生成obj和libs两个目录。
选择一种方法,编译这个例子。然后打开eclipse,把hello-jni这个工程导入,运行,ok,就能看到效果了。
进阶:
docs下的STABLE-APIS.TXT里面讲了系统API的用法。我以1.5为例。进入$NDK_ROOT/build/platforms/android-3/arch-arm/usr/include,里面有很多.h文件,这些都是可以在NDK里面调用的,除了linux和asm目录下的。
一般来说,主要用到的是jni.h,里面提供了很多对类和对象的操作。
另外,1.5提供了log的API,在android/log.h里面,使用的时候,在c文件中#include <android/log.h>,然后在Android.mk里面加上LOCAL_LDLIBS := -llog,就可以了。
1.6到2.01提供了openGL ES 1.x的API,2.1提供了openGL ES 2.0的API,2.2提供了graphics的处理接口。使用方法同log。
实例:
给出两个点的坐标,求它们的距离。
首先,创建一个Point对象,
public class Point { float x; float y; }
然后在c文件中定义一个函数
jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){}
返回值是float,在jni中定义的是jfloat。
函数名规则: Java开头,接着是包名的每一段,然后是类名,最后是Java中调用的方法名,中间都用下划线隔开。第一个参数JNIEnv* env和第二个参数jobject thiz都是必须的,后面的才是Java中传递进来的参数。这里是两个Point对象。
首先确定要做的步骤:
1.找到这个Point类
2.找到类中的域x和y的域id
3.根据ID取出x和y的值
4.计算结果并返回
那么代码如下:
#include <jni.h> #include <math.h> #include <android/log.h> jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b) { //步骤1 jclass point_class = (*env)->FindClass(env, "chroya/demo/ndk/Point"); if(point_class == NULL) { //printf("class not found"); __android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "class Point not found"); return 0; } else { __android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "found class Point"); } //步骤2 jfieldID field_x = (*env)->GetFieldID(env, point_class, "x", "F"); jfieldID field_y = (*env)->GetFieldID(env, point_class, "y", "F"); //步骤3 jfloat ax = (*env)->GetFloatField(env, a, field_x); jfloat ay = (*env)->GetFloatField(env, a, field_y); jfloat bx = (*env)->GetFloatField(env, b, field_x); jfloat by = (*env)->GetFloatField(env, b, field_y); //步骤4 return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2)); }
然后在Java里面调用:
public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(getApplicationContext()); Point a = new Point(); a.x = 3; a.y = 3; Point b = new Point(); b.x = 5; b.y = 5; float d = distance(a,b); tv.setText("distance(a,b):"+d); setContentView(tv); } public native float distance(Point a, Point b); static { System.loadLibrary("demo"); } }
运行,得到结果distance(a,b):2.828427
源码参见附件 。
- MyNdkDemo.zip (109.3 KB)
- 下载次数: 471
评论
推荐一下 《【eoe特刊】第七期:NDK》
这个例子讲解的很详细啊
发表评论
-
Android NFC内部机制分析
2012-08-06 19:48 3一、初始 一般需要使用nfc ... -
Android NFC简介
2012-08-03 11:31 4373目录: Android NFC ... -
Android放大镜的实现
2011-02-24 20:29 14329快三个月了没写博客了,因为工作调动,很多经验、心得都没 ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15510今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23212见过没有用opengl的3D动画,看了一下,是 ... -
让自己的Android应用支持appwidget
2010-11-26 13:25 7854经常看到一些教程教你如何写appwidget, ... -
ConditionVariable的用法
2010-11-07 21:35 8758线程操作经常用到wait和notify,用起来稍显 ... -
Android自定义长按事件
2010-11-06 20:34 44724Android系统自带了长按事件,setOnLongC ... -
Android获取应用程序的大小
2010-10-22 23:53 11257今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25141Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13682android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10803一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5237一般情况下在an ... -
Android自由选择TextView的文字
2010-09-02 15:47 19425用过EditText的都 ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 6070在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6263最近封装一些功能 ... -
Android画图之Matrix(二)
2010-07-15 22:01 34079上一篇Android画图之Matrix(一) 讲 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32913Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10835前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15692最近写电子书 ...
相关推荐
NDK入门项目实战NDK入门项目实战NDK入门项目实战NDK入门项目实战NDK入门项目实战
本资源提供了一个Android NDK入门项目实战,通过实例帮助初学者理解和掌握NDK的使用。 ### 1. NDK基础知识 - **NDK的用途**:主要用在需要高效计算或使用C/C++库的场景,如音频视频处理、游戏开发、加密算法等。 -...
《史上最强NDK入门项目实战》是一份专为IT初学者设计的压缩包资源,旨在帮助用户快速掌握Android NDK的使用技巧。NDK(Native Development Kit)是Android平台的一个重要工具,允许开发者使用C/C++等原生代码编写...
通过“史上最强NDK入门项目实战”,你可以逐步学习和实践这些知识,从创建简单的本地函数到编写复杂的本地库,再到将它们无缝集成到Android应用中。这个项目不仅覆盖了基础知识,也可能涉及实际案例,帮助你在实践中...
NDK入门项目实战.zip
本教程提供的“史上最强NDK入门项目实战”包括一个实际的Android应用,通过NDK和JNI实现了一些功能。项目结构如下: 1. `史上最强NDK入门项目实战.doc`:这份文档详细阐述了项目的背景、实现步骤以及关键知识点,是...
压缩包中的“史上最强NDK入门项目实战.doc”很可能是详细的教程文档,包含每个步骤的指导和解释;“sources”可能包含了示例项目的源代码;“apps”可能是一些示例应用,用来展示NDK的使用;“myjni”可能是一个特定...
本项目“Android项目史上最强NDK入门项目实战”旨在帮助初学者深入理解NDK的使用,并通过实际操作来提升技能。 首先,我们来了解一下NDK的核心概念: 1. **JNI(Java Native Interface)**:是Java平台标准的一...
4.1 开发游戏:NDK特别适合游戏开发,可以使用C++编写游戏引擎,提高性能并减少内存占用。 4.2 使用第三方库:可以引入开源的C/C++库,如OpenCV、Box2D等,进行图像处理、物理模拟等操作。 4.3 调试技巧:使用NDK...
本项目以"Android应用源码史上最强NDK入门项目实战"为题,旨在为IT计算机专业的学生提供一个深入理解Android NDK开发的实践平台,特别适合于毕业设计和论文研究。 1. **NDK基础** NDK是Google提供的一个开源工具,...
本项目实战将带领你逐步完成一个简单的NDK项目,通过实践学习如何创建原生库、定义JNI接口、编译和调试原生代码,以及如何在Java层调用这些接口。通过这个过程,你将深入了解Android NDK的运作机制,为后续的高级...
【标题解析】:“史上最强NDK入门项目实战.rar”这个标题暗示了这是一个关于NDK(Native Development Kit)的初级教程项目,目标是帮助初学者掌握Android应用中的原生代码开发。NDK是Android开发中的一部分,它允许...
在"史上最强NDK入门项目实战"中,你可能会学习到如何: 1. 使用JNI调用C/C++代码进行数学运算或算法实现。 2. 使用NDK进行音频、视频编码解码。 3. 利用OpenGL ES进行图形渲染,提升游戏性能。 4. 实现与硬件传感器...