2012年2月13日

在 Linux 平台下使用 JNI

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

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

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

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

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

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

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

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

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

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

posted @ 2012-02-13 17:34 小小博客小小员 阅读(815) 评论(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 小小博客小小员 阅读(426) 评论(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 小小博客小小员 阅读(633) 评论(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 小小博客小小员 阅读(3267) 评论(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 小小博客小小员 阅读(9298) 评论(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 小小博客小小员 阅读(19245) 评论(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 小小博客小小员 阅读(17071) 评论(2) 推荐(1) 编辑

(翻译)Android属性系统

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

posted @ 2012-02-13 17:18 小小博客小小员 阅读(708) 评论(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 小小博客小小员 阅读(599) 评论(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 小小博客小小员 阅读(14177) 评论(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 小小博客小小员 阅读(691) 评论(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 小小博客小小员 阅读(496) 评论(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 小小博客小小员 阅读(676) 评论(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 小小博客小小员 阅读(905) 评论(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 小小博客小小员 阅读(273) 评论(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 小小博客小小员 阅读(423) 评论(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 小小博客小小员 阅读(510) 评论(0) 推荐(0) 编辑

导航