• 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”;失败时返回负数。

  • 相关阅读:
    判断语句和循环语句2.2比较运算符
    判断语句和循环语句2.5 if中使用else
    判断语句和循环语句2.1 True、False
    判断语句和循环语句2.9while循环
    判断语句和循环语句2.7 if嵌套
    判断语句和循环语句2.8应用:猜拳游戏
    判断语句和循环语句逻辑运算符
    K8S 搭建 Prometheus (一) 部署 nodeexporter, prometheusserver
    使用Hive运行Job程序报GC错误
    离线数仓(四)
  • 原文地址:https://www.cnblogs.com/renhui/p/9986394.html
Copyright © 2020-2023  润新知