一、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 接口指针。
返回值:
数组的长度。
2. NewObjectArray
jarray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);
构造新的数组,它将保存类 elementClass
中的对象。所有元素初始值均设为 initialElement
。
参数:
env:JNI 接口指针。
返回值:
Java 数组对象。如果无法构造数组,则为 NULL
。
抛出:
OutOfMemoryError:如果系统内存不足。
3. GetObjectArrayElement
jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index);
返回 Object
数组的元素。
参数:
env:JNI 接口指针。
返回值:
Java 对象。
抛出:
ArrayIndexOutOfBoundsException:如果 index
不是数组中的有效下标。
4. SetObjectArrayElement
void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value);
参数:
env:JNI 接口指针。
抛出:
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 类对象。
返回值:
成功时返回 "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 接口指针。
返回值:
成功时返回“0”;失败时返回负数。
四、Java 虚拟机接口(Java VM Interface)
1. GetJavaVM
jintGetJavaVM(JNIEnv *env, JavaVM **vm);
返回与当前线程相关联的 Java 虚拟机接口(用于调用 API 中)。结果将放在第二个参数 vm
所指向的位置。
参数:
env:JNI 接口指针。
vm
:指向放置结果的位置的指针。
返回值:
成功时返回“0”;失败时返回负数。