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 JNI 学习(十):String Operations Api & Other Apis的更多相关文章
- Android JNI 学习(十一):Invocation Api
1. 简介 Invocation API允许软件提供商在原生程序中内嵌Java虚拟机.因此可以不需要链接任何Java虚拟机代码来提供Java-enabled的应用程序. 以下代码演示如何使用: #in ...
- Android JNI 学习(五):References Api
1. NewGlobalRef(创建全局引用) jobjectNewGlobalRef(JNIEnv *env, jobject obj); 创建 obj 参数所引用对象的新全局引用.obj 参数既可 ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(二)——实战JNI之“hello world”
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI 学习(一):JNI 简介
JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...
- Android JNI 学习(六):Object Operations Api
一.AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 对象而不调用该对象的任何构造函数.返回该对象的引用. cla ...
- Android JNI 学习(四):接口方法表 & Base Api & Exception Api
本文我们来总结一下JNI 提供的功能列表及相关的函数表. 注意:请注意使用术语“必须”来描述对JNI程序员的限制.例如,当您看到某个JNI函数必须接收非NULL对象时,您有责任确保不将NULL传递给该 ...
随机推荐
- Java并发编程之并发容器
解决并发情况下的容器线程安全问题的.给多线程环境准备一个线程安全的容器对象. 线程安全的容器对象: Vector, Hashtable.线程安全容器对象,都是使用 synchronized 方法实现的 ...
- jenkins远程执行脚本时报Bad version number in .class file
这几天在学习jenkins的持续集成和部署,到了最后一步启动服务的时候,遇到了一个这个Bad version number in .class file的报错(如下图). 这个报错在最开始手工部署的时 ...
- python基础 (函数名,闭包,和迭代器)
1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...
- swift 实现拍照 选择相册
//点击按钮的方法 func photos() { self.showBottomAlert() } /// 屏幕底部弹出的Alert func showBottomAlert(){ let aler ...
- Django ORM 常用字段和参数
Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...
- Chrome自定义滚动条
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16px; height: 16px; background-color: #F5 ...
- ArrayAdapter构造方法中的textViewResourseId
simple_list_item_1:每个列表项都是一个普通的textView simple_list_item_2:每个列表项都是一个普通的textView(字体略大) simple_list_it ...
- 整合 springboot 和 swagger出问题
整合 springboot 和 swagger ,出现报错, org.springframework.beans.factory.UnsatisfiedDependencyException: Err ...
- Dom4j 封装DOM和SAX 的方法
Dom4j 封装DOM的解析XML文件的方法: List<Book> bookList=new ArrayList<Book>(); //1.1 建立一个解析器工厂: Docu ...
- 对int数组排序
// 排序-->小到大1 public void sortArray(int[] targetArr) { long t = System.currentTimeMi ...