2012年2月13日

在 Linux 平台下使用 JNI

摘要: 张翼翔 李庆明,简介:本文简要介绍了 JNI 调用规范,及常用函数。并通过具体示例程序展示了实现一个本地调用的基本步骤。本文的标签: best_practices, jni, 应用开发标记本文!发布日期:2002 年 10 月 29 日 级别:初级 访问情况 :8431 次浏览 评论:0(查看|添加评论 - 登录) 平均分 (27个评分)为本文评分引言Java 的出现给大家开发带来的极大的方便。但是,如果我们有大量原有的经过广泛测试的非 Java 代码,将它们全部用 Java 来重写,恐怕会带来巨大的工作量和长期的测试;如果我们的应用中需要访问到特定的设备,甚至是仅符合公司内部信息交互规范的设 阅读全文

posted @ 2012-02-13 17:47 小小博客小小员 阅读(262) 评论(0) 推荐(0)

Linux下线程同步对象(3)——条件变量

摘要: 在前面两篇文章中介绍了Linux下的互斥量和读写锁两种线程同步对象。这两种线程同步对象都是用来保护特定资源(内存,文件句柄等)的。假如某个线程需要等待系统处于某种状态下才能继续执行,Linux为了解决这种问题引入了条件变量这种线程同步对象,本文简要介绍一下条件变量。 条件变量必须要与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生。线程在等待条件变量和通知条件变量之前都必须要先把保护条件变量的互斥量加锁。 和其他线程同步对象一样,条件变量一样需要初始化和销毁,函数定义如下: #include <pthread.h> int pthread_cond_dest... 阅读全文

posted @ 2012-02-13 17:35 小小博客小小员 阅读(402) 评论(0) 推荐(0)

Linux下线程同步对象(1)——互斥量

摘要: 进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等资源,是一个静态的概念。线程是CPU调度的对象,是一个动态的概念。一个进程之中至少包含有一个或者多个线程。这些线程共享该进程空间的内存和文件句柄资源,多个线程竞争地获得这些资源。为了防止多个线程访问资源的不一致性,多线程编程一个很重要的任务就是控制好线程同步。本文简单介绍一下Linux的同步对象和使用时的一些注意事项。1、互斥量(Mutex) 互斥量本质上讲是一把锁,该锁保护一个或者一些资源(内存或者文件句柄等数据)。一个线程如果需要访问该资源必须要获得互斥量,并对其加锁。这时如果其他线程如果想访问该资源也必须要 阅读全文

posted @ 2012-02-13 17:34 小小博客小小员 阅读(466) 评论(0) 推荐(0)

Linux下线程同步对象(2)——读写锁

摘要: 上文介绍了Linux下线程同步对象——互斥量,本文介绍另外Linux下同步对象——读写锁。 如果多个线程同时读资源,则不会发生竞争关系,也不会出现资源的不一致性,所以读资源的时候不需要同步对象保护。但是如果写某个资源的时候,必须要进行同步保护,否则将会出现不一致性。在上文的互斥量中,不管读写都加锁,这样对于读资源操作非常多,但写资源非常少的情况下,效率会比较低。Linux提供了读写锁来解决这种情况下的效率问题。 读写锁分为读锁定状态和写锁定状态,多个线程可以同时获得读锁定状态锁,进行各自的读操作。但是写锁定状态只能有一个线程获得,其他的线程线程的读锁定请求和写锁定请求都将会阻塞,直到当前的写锁 阅读全文

posted @ 2012-02-13 17:34 小小博客小小员 阅读(831) 评论(0) 推荐(0)

Linux进程间通信(IPC)之二——命名管道(FIFO)

摘要: 1 命名管道(FIFO) 经过前文《Linux进程间通信(IPC)之一——管道》介绍管道,但是管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in fi 阅读全文

posted @ 2012-02-13 17:33 小小博客小小员 阅读(461) 评论(0) 推荐(0)

Linux下JNI实现

摘要: 最近研究Android,涉及到JNI调用。虽然我对Java语言有所了解,但是还没有接触过JNI。今天在Unix Center的Ubuntu上面用JNI实现了“经典”的“Hello world”程序。通过这个简单的程序把JNI的一些小知识进行一下总结。什么是JNI JNI是Java native interface的简写,可以译作Java原生接口。Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个福音。 使用JNI也是有代价。大家都知道JAVA程序是运行在JVM之上的,可以做到平台无关。但是如果Java程序通过JNI调用了原生的代码(比如c/c++等), 阅读全文

posted @ 2012-02-13 17:30 小小博客小小员 阅读(3294) 评论(0) 推荐(0)

Linux进程间通信(IPC)之一——管道

摘要: 1 管道(Pipe) 管道是UNIX系统IPC的最古老的形式,并且所有的Unix系统都提供这种通信机制,当然也包括Linux。这样利用管道进行IPC管道具有如下限制:1、历史原因造成管道是半双工的,数据只能单向流动。如果想双向通信,必须要创建两个管道。2、管道通信双方必须有亲缘关系的进程之间(父子进程或者兄弟进程之间)。2 管道的创建#include <unistd.h>int pipe(int pipefd[2]); 经由pipefd参数返回两个文件描述符,pipefd[0]描述符用来读取管道中的数据,可以简称为管道的读端;pipefd[1]文件描述符用来向管道写入数据,简称为管 阅读全文

posted @ 2012-02-13 17:30 小小博客小小员 阅读(668) 评论(0) 推荐(0)

图像解码之三——giflib解码gif图片

摘要: 前面已经介绍过了libjpeg解码jpeg图片和libpng解码png图片,本文将会介绍怎样用giflib解码gif图片。giflib可以在这里下载。gif文件格式简单介绍 在解码jpeg图片和png图片的时候我们不需要对jpeg和png文件格式有了解就可以解码了(了解jpeg和png当然更好),但是在使用giflib解码gif的时候,我们必须要对gif文件有很简单的了解。 gif文件中可以存放一帧或者多帧图像数据,并且可以存放图像控制信息,因此可以存储动画图片。 gif文件由文件头开头,文件尾结尾,中间是一些连续的数据块(block)。这些数据块又分为图像数据块和扩展数据块(extensio 阅读全文

posted @ 2012-02-13 17:28 小小博客小小员 阅读(10038) 评论(0) 推荐(2)

图像解码之二——使用libpng解码png图片

摘要: 上文《图像解码之一——使用libjpeg解码jpeg图片》介绍了使用libjpeg解码jpeg图片。png图片应用也非常广泛,本文将会简单介绍怎样使用开源libpng库解码png图片。libpng的数据结构 png_structp变量是在libpng初始化的时候创建,由libpng库内部使用,代表libpng的是调用上下文,库的使用者不应该对这个变量进行访问。调用libpng的API的时候,需要把这个参数作为第一个参数传入。 png_infop变量,初始化完成libpng之后,可以从libpng中获得该类型变量指针。这个变量保存了png图片数据的信息,库的使用者可以修改和查阅该变量,比如:查. 阅读全文

posted @ 2012-02-13 17:27 小小博客小小员 阅读(19827) 评论(0) 推荐(3)

图像解码之一——使用libjpeg解码jpeg图片

摘要: 多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中。本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件。本文为第一篇,介绍使用libjpeg解码jpeg文件。libjpeg简介 libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。这个库由独立JPEG工作组维护。最新版本号是6b,于1998年发布。可以参考维基百科关于libjpeg的介绍。libjpeg库的数据结构 用libjpeg库解码jpeg数据的时候,最重要的数据类型为struct jpeg_decompr 阅读全文

posted @ 2012-02-13 17:26 小小博客小小员 阅读(18060) 评论(2) 推荐(1)

(翻译)Android属性系统

摘要: 属性(property)系统对Android来说是一个重要的功能。他作为一个系统服务管理着系统的配置和状态,所有的这些系统配置和状态都是属性(property)。属性(property)是一对键/值(key/value)组合,键和值都是字符串类型。总体感觉属性系统非常像Windows的注册表的功能。Androd中非常多的应用程序和库直接或者间接的依赖于属性系统,并由此决定其运行期的行为。例如:adbd进程通过属性来决定是否当前运行在模拟器中。再比如:java.io.File.pathSeparator方法返回存储在属性服务中的值。属性系统怎样工作 属性系统宏观的结构图如下所示: 从图中我们可. 阅读全文

posted @ 2012-02-13 17:18 小小博客小小员 阅读(732) 评论(0) 推荐(0)

CSDN移动博文集锦之Android核心分析

摘要: 导读:对于Android开发者来说,成系列的技术文章对他们的技术成长帮助最大。如下是我们向您强烈推荐的主题为Android开发的第一个系列文章。文章皆来自CSDN网友maxleng的专栏,maxleng是名Android爱好者,长期从事嵌入式系统及手机软件系统研究,自2010年4月起,在CSDN上先后发表28篇《Android核心分析》系列博文,收到网友们的极高评价。《Android核心分析》整理如下:1. 方法论探讨之设计意图2. 方法论探讨之概念空间篇 3. 手机之硬件形态4. 手机的软件形态5. Android基本空间划分6. IPC框架分析(Binder,Service,Service 阅读全文

posted @ 2012-02-13 17:16 小小博客小小员 阅读(611) 评论(0) 推荐(0)

Android应用程序获得root权限

摘要: 我在博文《Android程序的安全系统》中提到两种让root权限的办法。最近在网上发现很多朋友转载那篇文章,但是对那篇文章中提到的第一种方法怎样实现,不是很明白。本文将会以一个例子实现来演示怎样让一个Android应用程序获得root权限。问题 我遇到的问题是我想在Java应用程序中动态mount一个NFS的系统,但是执行mount命令必须要要root权限才可以。一般情况下,在Android的Java层是不能获得root权限的。思路 我在博文《Android程序的安全系统》中提到两种思路:1、实现一个init实现一个Service,来帮助Android应用程序执行root权限的命令。 ... 阅读全文

posted @ 2012-02-13 17:12 小小博客小小员 阅读(14284) 评论(0) 推荐(4)

Android系统的Binder机制之四——系统Service

摘要: 前面我们已经介绍了Android Binder机制的Service Manager,Service对象代理1,Service对象代理2。本文将介绍一下Android机制的另外一个重要部分——系统Service。1、系统Service实例——Media server 首先我们先看一下Android一个实例Media Service,代码位于framework/base/media/mediaserver/main_mediaserver.cpp文件: 1: // System headers required for setgroups, etc. 2: #include <sys/t.. 阅读全文

posted @ 2012-02-13 17:11 小小博客小小员 阅读(720) 评论(0) 推荐(0)

Android系统的Binder机制之三——服务代理对象(2)

摘要: 上文《Android系统的Binder机制之二——服务代理对象(1)》我们学习了进程的C/C++层面的服务代理对象BpBinder,和Binder底层处理方式。本文我们将深入分析一下在进程的Java层面服务代理对象的创建和使用。Android进程的C/C++层面和Java层 Android中程序大部分都是java开发,底层通过JNI调用C/C++的代码。这样一个程序就分为了两个层面C/C++层面和Java层面。运行状态下,我们说它们都在一个进程之中,拥有相同的进程属性(UID,GID等等)。 Binder客户程序的C/C++层面的对象和原理我们在上文《Android系统的Binder机制之二— 阅读全文

posted @ 2012-02-13 17:08 小小博客小小员 阅读(518) 评论(0) 推荐(0)

Android系统的Binder机制之二——服务代理对象(1)

摘要: 上文《Android系统的Binder机制之一——Service Manager》我们学习了Service Manager在Android Binder中的作用——服务(Service)注册,服务(Service)查询的功能。本文我们一起学习服务(Service)在客户端中的代理机制。重点介绍其核心对象BpBinder。 1、服务代理的原理 如下是客户端请求service服务的场景:1、首先客户端向Service manager查找相应的Service。上文《Android系统的Binder机制之一——Service Manager》有比较详细的介绍。注意客户端和Service可能在... 阅读全文

posted @ 2012-02-13 17:06 小小博客小小员 阅读(708) 评论(0) 推荐(0)

Android系统的Binder机制之一——Service Manager

摘要: Android虽然构建在Linux上面,但是在IPC(进程间)机制方面,没有利用Linux提供IPC机制,而是自己实现了一套轻量级的IPC机制——binder机制。并且Android Binder机制之上,Android框架提供了一套封装,可以实现对象代理(在本地进程中代理远程进程的对象)。本文简单分析一下Android Binder机制。Binder情景分析 一个IPC通讯我们可以理解成客户端-服务器模式,因此我们先在这里分析一下典型的Binder应用模式:1、客户端通过某种方式(后文会详细介绍)得到服务器端的代理对象。从客户端角度看来代理对象和他的本地对象没有什么差别。它可以像其他本地对. 阅读全文

posted @ 2012-02-13 17:05 小小博客小小员 阅读(942) 评论(0) 推荐(0)

深入理解Android消息处理系统——Looper、Handler、Thread

摘要: 熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。Android通过Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。本文深入介绍一下Android消息处理系统原理。 Android系统中Looper负责管理线程的消息队列和消息循环,具体实现请参考Looper的源码。 可以通过Loop.myLooper()得到当 阅读全文

posted @ 2012-02-13 17:04 小小博客小小员 阅读(291) 评论(0) 推荐(0)

电子书

摘要: 原来电子书都存放在163网盘上,近期有网友反映163网盘不给力,广告太多!我决定把电子书慢慢转移到华为115网盘上,如果你也想注册115网盘,请点击Simon的邀请链接,这样你和Simon都将获得300M的免费奖励空间。声明:Simon的电子书大部分来自互联网,如果您发现这些电子书侵犯了你的版权,请联系Simon,我会进行妥善处理。Linux/UNIXLinux内核完全注释(赵炯) Unix环境高级编程(英文版)源码 Unix环境高级编程(中文版)源码 Linux Command Line and Shell Scripting Bible 虚拟文件系统... 阅读全文

posted @ 2012-02-13 17:01 小小博客小小员 阅读(461) 评论(0) 推荐(0)

Android JNI编程提高篇之二

摘要: 上文《Android JNI编程提高篇之一》中我和大家分享了局部引用的一些理解,本文我将继续和大家全局引用和弱全局引用的一些理解。这也可以作为我学习《Java Native Interface: Programmer’s Guide and Specification》一个总结,欢迎大家对本文的理解拍砖。全局引用 在所有引用中,我觉得全局引用是最好理解的一个了。为什么呢?主要和C语言的全局变量非常相近。 上文《Android JNI编程提高篇之一》我已经提到局部引用大部分是通过JNI API返回而创建的,而全局引用必须要在Native代码中显示的调用JNI API NewGlobalRef来创 阅读全文

posted @ 2012-02-13 17:00 小小博客小小员 阅读(524) 评论(0) 推荐(0)

Android JNI编程提高篇之一

摘要: Simon在拙文《Android JNI开发入门之二》中提到了,Android JNI开发的深入学习的一些资料和方法。最近Simon在学习《Java Native Interface: Programmer’s Guide and Specification》,在学习过程中发现在JNI规范中关于引用部分是最难理解的,恕Simon愚钝,看了两遍才对其思想略有理解,在此和大家分享我对JNI规范中引用部分的理解,如果有错误之处,希望能和各位网友一起探讨。什么是JNI规范中对象引用 在JNI编程中,Native代码不能对Java虚拟机中对象的内存分布有任何假设。因为Java虚拟机可以根据自己的策略定. 阅读全文

posted @ 2012-02-13 16:58 小小博客小小员 阅读(611) 评论(0) 推荐(0)

Android JNI开发入门之二

摘要: 在上一篇文章《Android JNI开发入门之一》中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库。本文将进一步介绍Android应用程序通过JNI调用Native C++实现的共享库,并实现一个和上文《Android JNI开发入门之一》相同功能的Helloworld应用程序。两套不同的API 前文已经提到,Android系统的Java虚拟机为C和C++实现两套不同的API,所以我们调用的时候需要注意这一点儿。另外Google并没有提供JNI的文档,我们调用的时候可以参考Android的jni.h文件,里面有C和C++的JNI函数原型。也可以把本例. 阅读全文

posted @ 2012-02-13 16:56 小小博客小小员 阅读(363) 评论(0) 推荐(0)

Java: JNI完全手册

摘要: JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。AD:最近在公司里做了一个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接。短信接口是用C++写的。琢磨了三天,大致搞懂了JNI的主体部分。先将心得整理,希望各位朋友少走弯.. 阅读全文

posted @ 2012-02-13 16:39 小小博客小小员 阅读(308) 评论(0) 推荐(0)

Android平台刷机包制作研究(2)

摘要: 以下是偶翻译的关于boot.img和recovery.img的编辑和修改方面的文章,希望能够为感兴趣的朋友节约一些看资料的时间。感谢本文的作 者:Alansj, DarkriftX, RyeBrye, Will, Try OP9, Tonyb486, Timmmm, Lxrose还有好多不知名的作者们在wiki上的不懈努力。如何解包/编辑/大包boot.img文件很多人用自己的方式解决了boot.img的解包/编辑/打包的问题,有人要求我来写一篇关于boot和recovery映像的文件结构和如何对其编辑的文章,于是就有了下面这篇文章。目录1、背景知识2、boot和recovery映像的文件结构 阅读全文

posted @ 2012-02-13 11:50 小小博客小小员 阅读(1039) 评论(0) 推荐(0)

Android平台刷机包制作研究(1)

摘要: 好久没有上博客来看看,甚至用户名和密码都记得不那么真切了。言归正传,最近有朋友问偶如何制作android平台的刷机包的问题。总算说服自己研究一下 如何制作一个android平台的刷机包,可能我了解的方法还不是很全面,也走了不少的弯路,但是以此做为一串探索的足迹,希望能为来者节约宝贵的时间, 也请对此感兴趣的各位同仁尽量避免偶曾经犯过的错误。在此先要明确声明一下:由于android平台的更新换代过于频繁,偶的做法不一定好用,也不一定完全正确(只是记录一下偶在自己的nexus one上面做的一些实验而已)。依照偶的做法出现了您的手机出现任何问题,偶都是不负责的喔!!英文好的朋友可以不必看着偶聒噪, 阅读全文

posted @ 2012-02-13 11:48 小小博客小小员 阅读(704) 评论(0) 推荐(0)

android平台中编写jni模块的方法(2)

摘要: 继续上一篇,目前android平台的sdk已经发布到了cupcake 1.5的版本(最新的开发版可能要比这个版本更高,期待android 2.0 :D)对 于android 1.5版本的开发者而言,一个非常大的好消息是cupcake已经开始“官方”支持开发者编写自己的jni库了,这主要表现在google放出了一个叫做 android-ndk的开发包,这个开发包是专门为了开发jni而准备的一些必要的头文件以及一些运行时所需的库,为android应用开发者提供了比 较方便的脚本支持。这种方便和快捷是在android 1.0和1.1的sdk以及配套的工具里面是没有的。试用了ndk以后感觉良好,偶对于 阅读全文

posted @ 2012-02-13 11:46 小小博客小小员 阅读(317) 评论(0) 推荐(0)

android平台中编写jni模块的方法(3)

摘要: 这篇文章来说说ndk的使用方法,其实主要是关于ndk的一些编译选项的研究和翻译(其实人家google的文档已经说的很清楚了)。偶选用的测试环境是 slackware 12.0 + android 1.5 r1 for linux + jdk 1.6.0_12,ndk选用的是android 1.5 ndk r1这个版本的(直接解压就行,免安装的)。1、从ndk安装说起ndk安装的时候需要运行一 个~/android-ndk-1.5_r1/build/目录下面的一个叫做host-setup.sh的脚本。大略读了一下这个脚本,发现这个主要是 用来生成out/host/host/config.mk文件 阅读全文

posted @ 2012-02-13 11:46 小小博客小小员 阅读(724) 评论(0) 推荐(0)

android平台中编写jni模块的方法(1)

摘要: 本文主要来记录一下偶对android平台下面jni技术的研究心得体会,一来是备忘,二来也为后来者节省一些独自摸索的时间。一直在忙 着project方面的事情,听到一个朋友提起说偶的blog很久没有更新了。所以今天抽一些时间上来写点东西。没办法,随着手机行业的竞争日趋白热化, 加上google,apple,palm之流的公司搅局,在手机领域的从业者的空闲时间越来越少,竞争也日趋白热化。闲话少叙,开始进入正题:1、介绍一下命令行开发的方法由于用c/c++习惯了,所以对eclipse的使用很是不习惯,还是决定用命令行(makefile类似)的方式进行编译、开发(偶个人比较痴迷emacs)。如果是ja 阅读全文

posted @ 2012-02-13 11:44 小小博客小小员 阅读(492) 评论(0) 推荐(0)

java代理模式 (转)

摘要: java代理模式 (转) 1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到三个角色: 抽象角色:声明真实对象和代理对象的共同接口; 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。以下以《Java与模式》中的 阅读全文

posted @ 2012-02-13 11:32 小小博客小小员 阅读(258) 评论(0) 推荐(0)

导航