锁定老帖子 主题:NDK入门、提高和实战
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-04
最后修改:2010-08-04
网上也有一些对NDK的介绍,不过都是很简单的把sample里面的例子讲解一下,并不深入,我这里把我的所得分享一下。我下载的是Android Native Developer Kit (NDK) R4版本,当前的最新版。
我下面讲的都是以linux环境为准,因为我的系统是linux的。windows下可以弄个Cygwin,模拟linux环境,网上有很多介绍。
安装:
NDK_ROOT=~/android-ndk-r4b #后面的路径是NDK所在的目录,根据自己的目录修改 export NDK_ROOT 然后保存,重新打开bash。
使用:
进阶:
实例:
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对象。
#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 源码参见附件 。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-08-05
昨天我装Cygwin 都装了好久,不过最后还是ok了
这个例子讲解的很详细啊 |
|
返回顶楼 | |
发表时间:2010-08-05
这个例子很不错。
|
|
返回顶楼 | |
发表时间:2010-08-10
|
|
返回顶楼 | |
发表时间:2010-08-18
LZ不错,再看andriod java版
|
|
返回顶楼 | |
发表时间:2011-02-25
最近正在学习NDK,例子很好,容易上手。
|
|
返回顶楼 | |
发表时间:2011-05-18
想学一下 环境是windows的 装了个cygin 不知道怎么用 呢
|
|
返回顶楼 | |
发表时间:2011-05-20
我是用Cygwin来做的,我是在windows环境下进行开发。
推荐一下 《【eoe特刊】第七期:NDK》 |
|
返回顶楼 | |
发表时间:2011-05-22
跳跃性有点大,讲解不够详细,不过还是非常感谢。
|
|
返回顶楼 | |
浏览 17662 次