【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);
通知虚拟机平台相关代码无需再访问
utf
。utf
参数是一个指针,可利用
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”;失败时返回负数。
推荐阅读
- Android IntentService源码理解 及 HandlerThread构建消息循环机制分析
- Android JNI 学习(Invocation Api)
- Android 动态权限申请
- android形状属性锁屏密码动态模糊kotlin项目抖音动画记账app视频播放器等源码
- Android 集成 X5 WebView
- AutoCAD中的Donut和Helix
- AutoCAD单位介绍和设置图解
- AutoCAD学生版2020下载和安装详细图解
- AutoCAD锥面和切片