- 浏览: 124827 次
- 性别:
- 来自: 深圳
最新评论
-
T_bag:
...
TabHost 中的Activity执行顺序 -
ihopethatwell:
楼主,你能否写一个 int类型的一维数组的结构体?
linux NDK实例 -
gf_crazy:
刚好找第二种,其他地方全是第一种。
TabHost -
gangbener:
我们是可以把不同分辨率的图片放到不同的图片文件夹中去,问题是: ...
android程序中屏幕问题解决方案 -
shusanzhan:
学习了,Mark
android应用收费渠道
网上也有一些对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));
- }
#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");
- }
- }
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)
- 下载次数: 21
发表评论
-
android.os.NetworkOnMainThreadException
2011-12-24 13:14 1234不能在android的主线程中,执行一个网络操作 ... -
转载:为什么要对URI进行编码
2011-12-15 15:49 1078为什么需要Url编码,通常如果一样东西需要编码,说明这样东 ... -
multipart form-data boundary
2011-12-15 15:23 1022含义 ENCTYPE="multipart/ ... -
android http 附件
2011-12-15 14:17 1663一:服务器端: 1:struts-config.xml ... -
post 附件
2011-12-15 10:24 1006在做嘀咕客户端的时候,要实现拍照上传的功能。根据嘀咕api ... -
让Android应用获取系统权限
2011-12-08 18:46 1004在 android 的API中有提供 SystemCloc ... -
Android源码目录结构详解
2011-12-01 20:22 850Android 2.1 |-- Makefile |-- ... -
两个activity跳转
2011-11-25 16:06 1278Activity A跳转到 Activity B /**A. ... -
线程同步之wait()/notify()的使用
2011-11-21 11:24 1001wait()/notify() 通常,多 ... -
游戏中渲染线程与更新线程交替执行
2011-11-21 11:21 945private final State mThreadLock ... -
android colormatrix
2011-11-03 17:32 1497在编程中有时候需要 ... -
java栈,堆,池
2011-07-08 09:38 751今天复习了一下这些知识,顺便做了下笔记.1.寄存器:最快的存储 ... -
3D开发的境界
2011-06-04 20:12 704第一阶段:初学者阶 ... -
Http
2011-06-01 17:10 1312使用 HTTP 服务: 1. Apache HttpCline ... -
获取手机的Opengl的支持版本
2011-05-27 09:28 1464public int getGLVersion() { ... -
性能优化
2011-05-27 09:26 791如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集 ... -
Android游戏中其他语言数据类型之间的转换方法
2011-05-17 11:43 1236Java与其他语言数据类型之间的转换方法实例程序 /* ... -
android canvas.getClipBounds
2011-05-13 17:41 8439一种是传参数: Rect dstRect = new Re ... -
获取屏幕大小的方法
2011-05-13 17:38 603// one DisplayMetrics dm = n ... -
Android Lock 使用
2011-05-13 16:43 3210PowerManager 和PowerManager.Wa ...
相关推荐
接下来是Android NDK的开发实例。NDK开发主要包括编写C/C++代码、创建JNI接口以及在Java层调用这些接口。以下是一步步的流程: 1. **创建JNI接口**:在Android Studio项目中,新建一个jni目录(如果不存在),然后...
在Linux或Mac上,可能需要编辑`.bashrc`或`.zshrc`文件。 3. **配置Android Studio**: 在Android Studio中,打开`File` -> `Project Structure` -> `SDK Location`,在`Android NDK location`处指定你安装NDK的路径...
### Android开发手记一_NDK编程实例 #### 一、开发环境的搭建 在开始具体的NDK编程之前,首先需要确保开发环境已经被正确地搭建起来。对于初次接触Android NDK开发的朋友来说,拥有一个良好的环境配置是至关重要的...
这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能...PATH=$PATH:/work/android/android-sdk-linux/platform-tools/:/work/android/android-sdk-linux/tools
在Windows环境下,Cygwin提供了一个类似Linux的命令行环境,使得NDK的使用更为方便。安装Cygwin时,确保选择`Devel`类别下的`make`, `gcc-g++`, `git`等开发相关包。安装完成后,同样将Cygwin的bin目录添加到`PATH`...
在这个简单的Android NDK实例中,我们一步步地了解如何集成C/C++代码到Android应用中: 1. **创建项目结构**:首先在Eclipse中创建一个Android项目,然后在项目的顶级目录下创建一个名为`jni`的文件夹。这个`jni`...
对于那些没有Linux环境但需要使用NDK的Windows用户,Cygwin提供了一个方便的解决方案。安装Cygwin时,需要选择正确的包以支持NDK的编译需求,例如autoconf2.1等。 **配置NDK集成Eclipse使用hello-jni实例步骤** 1....
本实例源码提供了完整的流程,展示了如何在Android Studio中进行NDK开发,编译C代码生成.so库和.jar包,并在另一个应用中调用。 首先,我们需要理解NDK的核心概念。NDK是一组工具,允许开发者使用C和C++编写部分...
### Android NDK 知识点解析 #### 1. 了解Android NDK及其带来的价值 Android NDK(Native ...无论是Windows还是Linux环境下的配置与开发,都旨在帮助开发者充分利用NDK的优势,创建出更加出色的应用程序。
2. **NDK实例实现**: - 在NDK r7之前,Windows用户需要Cygwin环境来运行NDK,但自r7版本开始,Google提供了`ndk-build.cmd`脚本,可以直接在Windows上使用,无需Cygwin。 - 在Eclipse中配置NDK Builder的步骤如下...
标题提到的“20130801_NDK_JNI的.so文件开发-安卓访问LINUX驱动”是关于如何使用JNI在Android应用中调用Linux驱动程序的教程。NDK(Native Development Kit)是Android的一个工具集,它提供了编译C/C++代码的能力,...
通过这个实例,我们了解到Android应用如何利用JNI调用本地代码,以及在不同平台(Windows、Mac、Linux)上如何使用NDK进行编译和调试。此外,NDK还支持更复杂的功能,如多线程、OpenSSL、OpenCV等库的集成,使得...
Linux环境下的JSON解析库——jsonc,是一种轻量级、纯C语言编写的JSON解析器。JSON(JavaScript Object Notation)是一种数据交换格式,广泛应用于Web服务与客户端之间的通信,而jsonc则为Linux系统提供了处理JSON...
**Skia描画库实例** Skia是一款强大的2D图形处理库,由Google开发并开源。它被广泛应用于Android、Chrome、PDFium等项目,提供跨平台的高性能图形渲染能力。在本文中,我们将深入探讨如何在Eclipse环境中,结合NDK...
该资源是hello-jni.tar.gz 实例,来源于android-ndk-r8e的sample。博主已经编译生成shared library,以备分析汇编文件使用。libs/armeabi目录下有博主生成的log.obj、log.elf、log.hex,分别由arm-robin-linux-...
4. **编译本地代码**:将C/C++代码编译为动态库,如Windows下的.dll,Linux下的.so,Mac下的.jnilib。 5. **加载动态库**:在Java代码中加载动态库,并调用其中的方法。 JNI的命名规则遵循特定格式,例如`Java_...
在Android系统中,虽然底层基于Linux内核,但上层是Java虚拟机和Android应用程序框架,因此在Android上实现DES可能涉及到JNI(Java Native Interface)或者NDK(Native Development Kit),以便在C/C++层处理加密...
总结来说,adb-ndk是针对armv8架构的adb和fastboot工具集,它为在Linux或Android系统上进行远程调试和固件管理提供了便利。无论是对TBOX等设备的操作,还是对armv8设备的系统级调试,这个工具都能发挥关键作用。了解...