Android JNI 学习(String Operations Api & Other Apis)

【Android JNI 学习(String Operations Api & Other Apis)】少年意气强不羁,虎胁插翼白日飞。这篇文章主要讲述Android JNI 学习:String Operations Api & Other Apis相关的知识,希望能为你提供帮助。
一、String Operations(字符串操作) 1. NewString

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

利用 Unicode 字符数组构造新的  java.lang.String  对象。
参数:env:JNI 接口指针。
unicodeChars:指向 Unicode 字符串的指针。
len:Unicode 字符串的长度。
返回值:Java 字符串对象。如果无法构造该字符串,则为  NULL
抛出:OutOfMemoryError:如果系统内存不足。
2. GetStringLength
jsize GetStringLength(JNIEnv *env, jstring string);

返回 Java 字符串的长度(Unicode 字符数)。
参数:env:JNI 接口指针。
string:Java 字符串对象。
返回值:Java 字符串的长度。
3. GetStringChars
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);

返回指向字符串的 Unicode 字符数组的指针。该指针在调用  ReleaseStringchars()  前一直有效。
如果  isCopy  非空,则在复制完成后将  *isCopy  设为  JNI_TRUE。如果没有复制,则设为JNI_FALSE
参数:env:JNI 接口指针。
string:Java 字符串对象。
isCopy:指向布尔值的指针。
返回值:指向 Unicode 字符串的指针,如果操作失败,则返回NULL。 
4. ReleaseStringChars
void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars);  

通知虚拟机平台相关代码无需再访问  chars。参数  chars  是一个指针,可通过  GetStringChars()从  string  获得。
参数:env:JNI 接口指针。
string:Java 字符串对象。
chars:指向 Unicode 字符串的指针。
5. NewStringUTF
jstring NewStringUTF(JNIEnv *env, const char *bytes);

利用 UTF-8 字符数组构造新  java.lang.String  对象。
参数:env:JNI 接口指针。如果无法构造该字符串,则为  NULL
bytes:指向 UTF-8 字符串的指针。
返回值:Java 字符串对象。如果无法构造该字符串,则为  NULL
抛出:OutOfMemoryError:如果系统内存不足。 
6. GetStringUTFLength
jsizeGetStringUTFLength(JNIEnv *env, jstring string);
以字节为单位返回字符串的 UTF-8 长度。
参数:env:JNI 接口指针。
string:Java 字符串对象。
返回值:返回字符串的 UTF-8 长度。 
7. GetStringUTFChars
const char* 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。 
8. ReleaseStringUTFChars
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);

通知虚拟机平台相关代码无需再访问  utfutf  参数是一个指针,可利用  GetStringUTFChars()  从  string  获得。
参数:env:JNI 接口指针。
string:Java 字符串对象。
utf:指向 UTF-8 字符串的指针。
二、数组操作(Array Operations) 1. GetArrayLength
jsize GetArrayLength(JNIEnv *env, jarray array);

返回数组中的元素数。
参数:env:JNI 接口指针。
array:Java 数组对象。
返回值:数组的长度。
2. NewObjectArray
jarray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);  

构造新的数组,它将保存类  elementClass  中的对象。所有元素初始值均设为  initialElement
参数:env:JNI 接口指针。
length:数组大小。
elementClass:数组元素类。
initialElement:初始值。
返回值:Java 数组对象。如果无法构造数组,则为  NULL
抛出:OutOfMemoryError:如果系统内存不足。
3. GetObjectArrayElement
jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index);

返回  Object  数组的元素。
参数:env:JNI 接口指针。
array:Java 数组。
index:数组下标。
返回值:Java 对象。
抛出:ArrayIndexOutOfBoundsException:如果  index  不是数组中的有效下标。
4. SetObjectArrayElement
void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value);

设置  Object  数组的元素。
参数:env:JNI 接口指针。
array:Java 数组。
index:数组下标。
value:新值。
抛出:ArrayIndexOutOfBoundsException:如果  index  不是数组中的有效下标。
ArrayStoreException:如果  value  的类不是数组元素类的子类。 
三、注册本地方法(Registering Native Methods) 1. RegisterNatives
jintRegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);  

向  clazz  参数指定的类注册本地方法。methods  参数将指定  JNINativeMethod  结构的数组,其中包含本地方法的名称、签名和函数指针。nMethods  参数将指定数组中的本地方法数。JNINativeMethod  结构定义如下所示:
typedef struct { char *name; char *signature; void *fnPtr; } JNINativeMethod;

函数指针通常必须有下列签名:
ReturnType (*fnPtr)(JNIEnv *env, jobject objectOrClass, ...);  

参数:env:JNI 接口指针。
clazz:Java 类对象。
methods:类中的本地方法。
nMethods:类中的本地方法数。
返回值:成功时返回 "0";失败时返回负数。
抛出:NoSuchMethodError:如果找不到指定的方法或方法不是本地方法。
2. UnregisterNatives
jintUnregisterNatives(JNIEnv *env, jclass clazz);

取消注册类的本地方法。类将返回到链接或注册了本地方法函数前的状态。
该函数不应在常规平台相关代码中使用。相反,它可以为某些程序提供一种重新加载和重新链接本地库的途径。
参数:env:JNI 接口指针。
clazz:Java 类对象。
返回值:成功时返回“0”;失败时返回负数。
三、监视程序操作(Monitor Operations) 1. MonitorEnter
jintMonitorEnter(JNIEnv *env, jobject obj);

进入与  obj  所引用的基本 Java 对象相关联的监视程序。
每个 Java 对象都有一个相关联的监视程序。如果当前线程已经拥有与obj  相关联的监视程序,它将使指示该线程进入监视程序次数的监视程序计数器增 1。如果与  obj  相关联的监视程序并非由某个线程所拥有,则当前线程将变为该监视程序的所有者,同时将该监视程序的计数器设置为 1。如果另一个线程已拥有与  obj  关联的监视程序,则在监视程序被释放前当前线程将处于等待状态。监视程序被释放后,当前线程将尝试重新获得所有权。
参数:env:JNI 接口指针。
obj:常规 Java 对象或类对象。
返回值:成功时返回“0”;失败时返回负数。
 
2. MonitorExit
jintMonitorExit(JNIEnv *env, jobject obj);

当前线程必须是与  obj  所引用的基本 Java 对象相关联的监视程序的所有者。线程将使指示进入监视程序次数的计数器减 1。如果计数器的值变为 0,当前线程释放监视程序。
参数:env:JNI 接口指针。
obj:常规 Java 对象或类对象。
返回值:成功时返回“0”;失败时返回负数。
四、Java 虚拟机接口(Java VM Interface) 1. GetJavaVM
jintGetJavaVM(JNIEnv *env, JavaVM **vm);

返回与当前线程相关联的 Java 虚拟机接口(用于调用 API 中)。结果将放在第二个参数  vm  所指向的位置。
参数:env:JNI 接口指针。
vm:指向放置结果的位置的指针。
返回值:成功时返回“0”;失败时返回负数。

    推荐阅读