2.在Android上编译C程序
(1)风临左岸在这方面颇有建树,以下是他的blog:
http://blog.sina.com.cn/flza
最简单的hello world程序可以参看下面这篇文章的做法。
Android原生(Native)C开发之一:环境搭建篇
http://blog.sina.com.cn/s/blog_4a0a39c30100auh9.html
这里有个概念要弄清楚,之前的例子都是针对x86-win32平台的,而这里我们要在arm-linux下编程。我这里有个同事,曾将x86-win32下的dll放到Android模拟器中,然后抱怨无法使用JNI,这就是这类错误的一个典型的例子。
还有一点需要注意的是,风临左岸使用的交叉编译工具,所编出的程序虽然可以在模拟器中运行,但却是无法直接用于JNI的,需要使用一定的技巧,可参见以下网页:
Shared library "Hello World!" for Android
http://honeypod.blogspot.com/2007/12/shared-library-hello-world-for-android.html
从这篇文章可以看出,风临左岸使用的交叉编译工具的动态库的默认格式,和Android平台的动态库的格式是不同的,这也是之前有人说Android无法使用JNI的原因。
更好的办法是直接使用google提供的交叉编译工具。
(2)获得Android的源代码
获得源代码的官方方法如下:
http://sites.google.com/a/android.com/opensource/download
虽然源代码在http://source.android.com下,但用浏览器是无法获得代码的,只能用上文提到的方法才行。
当然诸如www.androidin.com
之类的网站也提供了非官方的源代码下载。
源代码的大小有1G左右,解压源代码,在源代码的prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin文件夹下可以找到google提供的交叉编译工具。
使用prebuilt工具编译C程序的方法可以参考以下文章:
http://www.j2medev.com/android/native/200901/20090119222445.html
3.Android JNI
正统的做法可以参照以下网页:
http://www.j2medev.com/android/native/200901/20090119222617.html
当然简单的做法也是有的,可以只解压源代码中的bionic、dalvik、prebuilt这三个文件夹。
需要注意的是,和第三方的交叉编译工具不同,prebuilt下只有相关的头文件而没有相应的.o或.a文件,所以用一般的makefile的话,没有办法编译静态可执行文件,但是动态库文件是可以编的。
这里还有一个奇怪的地方,如果直接使用cc生成.so的话,会出错。而先cc生成.o,再ld生成.so就没问题。不知道这是什么原因,尚需高手指点。
这里也提供一个例子,功能和例子1.(3)相同。使用时,将.apk和.so都放在/data/app下即可。
http://www.namipan.com/d/cb2c2eb8c1c6852eaf744e382b8d9805b44e5a2e7f660000
4.关于一个语法现象
AlertDialog dialog = new AlertDialog.Builder(SmartGuider.this)
.setTitle("设置错误")
.setMessage("GPS功能未开启,请先开启GPS后再使用本程序!\n\n点击Ok进入系统设置页面,点击Cancel退出程序。")
.create();
在apidemo中,有很多类似于这样的语句。刚阅读到的时候,先是觉得是不是语法有误,怎么能在一条语句中,调用两个成员函数。接着一想,这是人家出的demo,怎么可能犯这种低级错误,一处也就罢了,总不可能到处都出这种错吧。
于是就考虑是不是Java的新语法,毕竟Java这种语言从1.0到1.7,已经有8个版本了,像@Override和模板之类的特性都是后来添加进去的。但查了半天也没查到出处。
于是去Android SDK中查看相关类的方法,才发现了奥妙。
AlertDialog create()
AlertDialog.Builder setTitle(CharSequence title)
AlertDialog.Builder setMessage(CharSequence message)
由于setTitle和setMessage返回的都是AlertDialog.Builder类型的引用(多半就是this),从而使得这样连写的语法
得以实现。如果把create放到setTitle或setMessage之前,显然就会出错了。因此这根本就不是什么新语法,而只是一种技巧而已。
在C语言中,其实也有类似的情况,例如
char *strcpy(char *strDestination,const char *strSource);
为什么不写成
void strcpy(char *strDestination,const char *strSource);
或者
char *strcpy(const char *strSource);
呢?
不采用第一种,是因为这样做可以使用诸如strlen(strcpy(...))之类的便捷写法。
不采用第二种,当然是和内存分配有关了,这里就不多说了。
分享到:
相关推荐
24.androidJNI实战手册
Android JNI串口通讯【实战例子】 学习NDK开发很好的例子,也可以直接用在项目中
在本篇Android JNI实战教程中,我们将探讨如何利用JNI(Java Native Interface)技术来实现一个温控计应用。JNI是Java平台提供的一种机制,允许Java代码与其他编程语言(如C和C++)进行交互,从而扩展Java应用的功能...
Android JNI编程实战手册
《Android JNI 深入解析与实战Demo》 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要角色,尤其是在性能优化、调用系统底层库或者...
在Android应用开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个重要的技术,用于实现Java代码与本地C/C++代码的交互。本实战教程将深入探讨NDK-JNI的开发过程,结合具体的AES加密DEMO,...
《Android之JNI实战指南》 在移动开发领域,Android与C/C++的交互是一个重要的技术环节,这主要得益于JNI(Java Native Interface)的存在。JNI允许Java代码与其他编程语言(如C/C++)编写的代码进行交互,使得我们...
9. **案例实践**:实战项目是学习JNI的最佳方式,教程通常会提供一些示例,如使用JNI进行性能优化、访问硬件设备、实现图形库等,帮助开发者巩固理论知识并提升实战技能。 10. **进阶话题**:更高级的主题可能包括...
这个PPT教程可能提供了丰富的Android JNI实战案例,如使用JNI访问SQLite数据库、与C++库集成、实现音频/视频解码等。通过实例,帮助开发者更好地理解和掌握JNI的实际应用。 总之,这个教程资源对于学习和掌握JNI...
项目实战部分将通过一个具体的示例展示如何从零开始搭建NDK项目,包括创建JNI接口、编写本地代码、配置构建脚本、集成到Android应用以及调试。这个过程有助于加深对NDK开发流程的理解。 通过这个项目,学生不仅...
《Android NDK与JNI实战:史上最详尽的NDK入门指南》 在移动开发领域,Android NDK(Native Development Kit)和JNI(Java Native Interface)是开发者用来实现高性能计算、利用硬件加速或调用C/C++库的重要工具。...
Android Jni的简单使用详解 Android Jni是Android系统中的一种native接口,它允许Java代码和native代码之间的交互。Jni提供了一种机制,允许Java代码调用native代码,而native代码也可以调用Java代码。Jni的使用...
最好结合JNI官方教程、官方文档来学习如何在Android中使用JNI技术。 解压后,有3个文件,如下: 【eoe特刊】第七期:NDK.pdf android_jni操作指南.pdf Android史上最强NDK入门项目实战.rar
《Android底层开发实战》这本书是针对想要深入理解Android系统内部工作原理以及进行底层开发的工程师们的一本宝贵指南。在Android开发中,底层开发通常涉及操作系统、硬件接口、驱动程序和系统服务等核心部分,这...
总的来说,"android jni demo"是一个很好的学习资源,它涵盖了JNI的基本概念和实战技巧,有助于提升你的Android原生开发能力。通过深入研究和实践,你将能够熟练地在Java和C/C++之间穿梭,为你的Android应用注入更强...
本套课程共分为三部分,当前为第一部分,主要包括内容:1、JNI名词释义2、JNI环境搭建3、Native项目解析4、编译工具使用5、边学边实战,从易到难,循序渐进适合人群:1、有一定Android基础,零JNI基础的学员;...
根据提供的文件信息,我们可以推断出这是一段关于C语言入门以及如何在Android环境中使用JNI(Java Native Interface)的相关教程。接下来,我们将详细介绍C语言的基础知识、在Android开发中的应用,以及JNI的基本...
在Android应用开发中,JNI(Java Native Interface)是一种关键技术,它允许Java代码和其他语言写的代码进行交互。这个“android_jni操作指南”很显然是为了帮助开发者深入理解和掌握JNI在Android平台上的使用。以下...
学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了一系列练习题,旨在巩固所学知识,检验学习成果。这些练习题既有基础题,也有难度较高的挑战题,适合不同层次的...