作者: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本地接口函数集总结
还有很多的函数,博文就不列出来了,这里是我学习过程中的一些小总结!