基于Android2.3.5系统:JNI与HAL实例解析[二]

***************************************************************************************************************************

作者:EasyWave                                                                                                           时间:2015.01.27

类别:Android系统-基于Android2.3.5系统:JNI与HAL实例解析[二]                    声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:Android系统下JNI简介

Android系统下的JNI的全称是:Java Native Interface (JNI),JNI标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

二:Android系统下JNI本地接口函数集

JNIEnv自变量是类型为JNIEnv的一个特殊JNI数据结构的指针,JNI数据结构的一个元素是指向由JVM生成的一个数组的指针;该数组的每个元素都是指向一个JNI函数的指针,可从固有方法的内容发出对JNI函数的调用。利用JNIEnv自变量,程序员可访问一系列函数。这些函数可划分为下述类别:

  • 获取版本信息
  • 进行类和对象操作
  • 控制对Java对象的全局和局部引用
  • 访问实例字段和静态字段
  • 调用实例方法和静态方法
  • 执行字串和数组操作
  • 产生和控制Java异常

比如:在C/C++本地代码中访问Java的String对象,在Java中,使用的字符串String对象是Unicode码,即每个字符不论是中文还是英文或是符号,一个字符总是占用两个字节。在C/C++本地代码中创建Java的String对象,Java通过JNI接口可以将Java的字符串转换到C/C++中的宽字符串(wchar_t
*),或是传回一个UTF-8的字符串(char *)到C/C++。反过来,C/C++可以通过一个宽字符串,或是一个UTF-8编码的字符串来创建一个Java端的String对象。

2.1):字符串操作

jstringNewString(JNIEnv *env, const jchar *unicodeChars, jsize len);

利用 Unicode 字符数组构造新的 java.lang.String 对象。

参数:

env:JNI 接口指针。

unicodeChars:指向Unicode字符串的指针。

len:Unicode字符串的长度。

返回值:Java 字符串对象。如果无法构造该字符串,则为 NULL。

抛出: OutOfMemoryError:如果系统内存不足。

jsizeGetStringLength(JNIEnv *env, jstring string);

返回 Java 字符串的长度(Unicode 字符数)。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

const
jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);

返回指向字符串的 Unicode 字符数组的指针。该指针在调用 ReleaseStringchars() 前一直有效。如果 isCopy 非空,则在复制完成后将 *isCopy 设为 JNI_TRUE。如果没有复制,则设为JNI_FALSE。

参数:

env:JNI 接口指针。

string:Java 字符串对象。 isCopy:指向布尔值的指针。

返回值:指向 Unicode 字符串的指针,如果操作失败,则返回NULL。

voidReleaseStringChars(JNIEnv
*env, jstring string,  const jchar *chars);

通知虚拟机平台相关代码无需再访问 chars。参数 chars 是一个指针,可通过 GetStringChars() 从 string 获得。与GetStringChars配对使用的。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

chars:指向 Unicode 字符串的指针。

jstringNewStringUTF(JNIEnv
*env, const char *bytes);

利用 UTF-8 字符数组构造新 java.lang.String 对象。

参数:

env:JNI 接口指针。如果无法构造该字符串,则为 NULL。 bytes:指向 UTF-8 字符串的指针。

返回值:Java 字符串对象。如果无法构造该字符串,则为 NULL。

抛出:OutOfMemoryError:如果系统内存不足。

jsizeGetStringUTFLength(JNIEnv *env, jstring string);

以字节为单位返回字符串的 UTF-8 长度。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

返回值:返回字符串的 UTF-8 长度。

const tchar*GetStringUTFChars(JNIEnv *env, jstring string,
jboolean *isCopy);

返回指向字符串的 UTF-8 字符数组的指针。该数组在被ReleaseStringUTFChars() 释放前将一直有效。如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果未复制,则设为 JNI_FALSE。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

isCopy:指向布尔值的指针。

返回值:指向 UTF-8 字符串的指针。如果操作失败,则为 NULL。

voidReleaseStringUTFChars(JNIEnv *env, jstring string,const
char *utf);

通知虚拟机平台相关代码无需再访问 utf。utf 参数是一个指针,可利用 GetStringUTFChars() 从 string 获得。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

utf:指向 UTF-8 字符串的指针。

          2.2):数组操作

fsizeGetArrayLength(JNIEnv
*env, jarray array);

返回数组中的元素数。

参数:

env:JNI 接口指针。

array:Java 数组对象。

返回值: 数组的长度。

jarrayNewObjectArray(JNIEnv *env, jsize length, jclass
elementClass, jobject initialElement);

构造新的数组,它将保存类 elementClass 中的对象。所有元素初始值均设为 initialElement。

参数:

env:JNI 接口指针。

length:数组大小。

elementClass:数组元素类。

initialElement:初始值。

返回值:Java 数组对象。如果无法构造数组,则为 NULL。

抛出:OutOfMemoryError:如果系统内存不足。

jobjectGetObjectArrayElement(JNIEnv *env, jobjectArray
array, jsize index);

返回 Object 数组的元素。

参数:

env:JNI 接口指针。

array:Java 数组。

index:数组下标。

返回值:Java 对象。

抛出:ArrayIndexOutOfBoundsException:如果index不是数组中的有效下标。

voidSetObjectArrayElement(JNIEnv *env, jobjectArray array,
 jsize index, jobject value);

设置 Object 数组的元素。

参数:

env:JNI 接口指针。

array:Java 数组。

index:数组下标。

value:新值。

抛出:

ArrayIndexOutOfBoundsException:如果index不是数组中的有效下标。

ArrayStoreException:如果value的类不是数组元素类的子类。

New<PrimitiveType>Array 例程

ArrayTypeNew<PrimitiveType>Array(JNIEnv*env, jsize length);  用于构造新基本类型数组对象的一系列操作。下表中说明了特定的基本类型数组构造函数。用户应把New<PrimitiveType>Array 替换为某个实际的基本类型数组构造函数例程名,然后将 ArrayType 替换为该例程相应的数组类型。

参数:

env:JNI 接口指针。

length:数组长度。

返回值:  Java 数组。如果无法构造该数组,则为 NULL。

   三:Android系统下JNI本地接口函数集总结

还有很多的函数,博文就不列出来了,这里是我学习过程中的一些小总结!

时间: 2024-08-16 04:19:25

基于Android2.3.5系统:JNI与HAL实例解析[二]的相关文章

基于Android2.3.5系统:JNI与HAL实例解析[一]

*************************************************************************************************************************** 作者:EasyWave                                                                                                           时间:2015.

基于Android2.3.5系统:Android.mk文件解析

*************************************************************************************************************************** 作者:EasyWave                                                                                                               时间:2

第7章 Android HAL实例解析

第7章 Android HAL实例解析 通过本章介绍Android的HAL知道HAL是为了一些硬件提供商提出的保护专利的驱动程序而产生的,是为了避开Linux的GPL束缚.HAL主要的存储目录有:1.libhardware_legany  2.libhardware:3.ril   4.msm7k.主要包含以下一些模块:Gps.Vibrator.Wifi.Copybit.Audio.Camera.Lights.Ril.Overlay等.大概了解了Android  HAL. 第1中方法 直接调用s

Android HAL实例解析

一.概述 本文希望通过分析台湾的Jollen的mokoid 工程代码,和在s5pc100平台上实现过程种遇到的问题,解析Andorid HAL的开发方法. 二.HAL介绍 现有HAL架构由Patrick Brady (Google) 在2008 Google I/O演讲中提出的,如下图. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚.思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作

【转】Android HAL实例解析

原文网址:http://www.embedu.org/Column/Column339.htm 作者:刘老师,华清远见嵌入式学院讲师. 一.概述 本文希望通过分析台湾的Jollen的mokoid 工程代码,和在s5pc100平台上实现过程种遇到的问题,解析Andorid HAL的开发方法. 二.HAL介绍 现有HAL架构由Patrick Brady (Google) 在2008 Google I/O演讲中提出的,如下图. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避

Android—JNI调用简单实例解析

转自:http://www.cnblogs.com/sevenyuan/p/4202759.html 感谢原作者的细心整理! 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj.jni;  public class TestJNI {         public native boolean Init();         public native int Add(int x, int y);        

从java层到framework到JNI到HAL到kernel的hello 例子

转载自 http://blog.csdn.net/Luoshengyang/article/category/838604/3 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Androi

基于 OS X Mavericks 系统

基于 OS X Mavericks 系统远景论坛黑苹果区新手引导 常见疑难解答 以及必要知识普及帖 请善用论坛搜索功能 认真仔细地阅读置顶帖里的教程以及注意事项 前言:之前建立10.9区求助规范帖时,顺手写了新手普及帖,但总感觉信息不全,无法解决很多新手遇到的常见问题.所以今天抽出点时间,重新完善一下. 首先声明:置顶集合贴V4.3 是个相当好的帖子,也是我花很多心血在上面的帖子.而且这个帖子长期更新,很多问题,静下心来看一遍集合贴后,基本都能解决了.比起发帖询问干等着解答回帖,还不如先好好看看

[转]建立大容量基于Web的Email系统

建立大容量基于Web的Email系统 王波 最近几年来,基于Web的免费Email系统非常流行.当前,几个著名的免费Email网站基本上已经成为大多数人的选择,建立单纯提供免费Email服务的站点不再像以前那样受到热烈欢迎,但是提供Web界面的Email服务已经成为了一个商业站点为其注册成员提供的基本服务之一. 一个Email系统可以分为服务器端和客户端,Web界面的Email系统则是将Email客户放在了Web服务器端,因此Email系统所需要实现的是一个Web界面的Email客户.然而,由于