美文网首页
唠唠 JNI string

唠唠 JNI string

作者: Drew_MyINTYRE | 来源:发表于2022-02-11 09:20 被阅读0次

创建字符串

jstring     (*NewStringUTF)(JNIEnv*, const char*);

通过调用 NewStringUTF(...) 函数,创建 Unicode 字符串,会构建一个新的 java.lang.String 字符串对象。这个新创建的字符串会自动转换成 Java 支持的 Unicode 编码。如果 JVM 不能为构造 java.lang.String 分配足够的内存,NewStringUTF 会抛出一个 OutOfMemoryError 异常,并返回 NULL。我们不必检查它的返回值,如果NewStringUTF 创建 java.lang.String 失败,OutOfMemoryError 这个异常会在 caller 中抛出。如果 NewStringUTF 创建 java.lang.String 成功,则返回一个 JNI 引用,这个引用指向新创建的 java.lang.String 对象。

(*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");

GetStringUTFChars

从 Java 字符串转换成 C/C++ 字符串,使用 GetStringUTFChars(...) 函数。

这是一个 JNI 函数,Java 默认使用 Unicode 编码,而 C/C++ 默认使用 UTF 编码,所以在本地代码中操作字符串的时候,必须使用合适的 JNI 函数把 jstring 转换成 C 风格的字符串。JNI 支持字符串在 Unicode 和 UTF-8 两种编码之间转换,GetStringUTFChars 可以把一个 jstring 指针(指向 JVM 内部的 Unicode 字符序列)转换成一个UTF-8 格式的 C 字符串。我们通过 GetStringUTFChars(...) 正确取得了 JVM 内部的字符串内容。

// JNIEnv 函数表指针
// jstring  代表 Java 传递给本地代码的字符串指针
// 取值 JNI_TRUE 和 JNI_FALSE,如果值为 JNI_TRUE,表示返回 JVM 内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为 JNI_FALSE,表示返回 JVM 内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了 Java 字符串不能被修改的规定。但我们在开发当中,并不关心这个值是多少,通常情况下这个参数填 NULL 即可。
const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);

Tips:

GetStringUTFChars()ReleaseStringUTFChars() 总是成对出现。

const char *version = (*env)->GetStringUTFChars(env, buildVersion, NULL);
if (!version) {
        LOGE("Unable to get version string @ line %d", __LINE__);
        return;
}
LOGI("Android Version - %s", version);
(*env)->ReleaseStringUTFChars(env, buildVersion, version);

// we are called from JNI_OnLoad, so got to release LocalRef to avoid leaking
(*env)->DeleteLocalRef(env, buildVersion);

异常检查

调用完 GetStringUTFChars(...) 之后不要忘记安全检查,因为 JVM 需要为新诞生的字符串分配内存空间,当内存空间不够分配的时候,会导致调用失败,失败后 GetStringUTFChars(...) 会返回 NULL,并抛出一个OutOfMemoryError 异常。JNI 的异常和 Java 中的异常处理流程是不一样的,Java 遇到异常如果没有捕获,程序会立即停止运行。而 JNI 遇到未决的异常不会改变程序的运行流程,也就是程序会继续往下走,这样后面针对这个字符串的所有操作都是非常危险的,因此,我们需要用 return 语句跳过后面的代码,并立即结束当前方法。

const char *version = (*env)->GetStringUTFChars(env, buildVersion, NULL);
    if (!version) {
        LOGE("Unable to get version string @ line %d", __LINE__);
        return;
    }

GetStringCharsReleaseStringChars

用于获取和释放以 Unicode 格式编码的字符串

相关文章

  • 唠唠 JNI string

    创建字符串 通过调用 NewStringUTF(...) 函数,创建 Unicode 字符串,会构建一个新的 ja...

  • 唠唠

    上班本来就很累,家里有个固执加野蛮的人更加累。我们都认为工作有最多不愉快的事,回到家的那个温暖的地方,一切都会烟消...

  • 唠唠

    做题做得脑袋麻木了 今天的任务还有123456……页 躺下喂个小O 趁他美梦中 刷个微博 写个日更 群里说说话 才...

  • 唠唠

    最近,总想写点什么,但又不知道从何说起。 杂乱吧,如果非要这么描述的话。匆忙,混沌,杂乱。九月份开...

  • 唠唠

    已经十几天未写东西了,倒不是偷懒,是眼睛出了点状况。 两个周以前,忽然感觉右眼不适。别说是看电脑或手机,就是看书、...

  • 唠唠

    我是一孤僻的人,喜欢独处,每天的日常无非就是非开盘时间有声书,开盘时间打开手机行情、屏幕设个永不黑屏,听歌听音乐。...

  • 唠唠

    今天是零基础训练营结束后的第一天,没有了思考题?没有了大作业,没有了群里的早安……心里空落落的,有点不适应。 我的...

  • 唠唠

    突然就有点失眠,实际上下午还胸口痛呢,晚上吃了点药,竟然睡不着。害怕影响孩子休息,我主动到书房里的破沙发上睡。我们...

  • 唠一唠

    闲来无事,便来新华书店看书了。刚坐下,有两个小男孩子,被父母安排在我的邻座与对面。 我们各自看着自己的书,一切变得...

  • 随笔唠唠

    今天是2018年9月9日,周日,是今年以来第一次媳妇休假而我还得苦逼的要上夜班的日子(之前处于淡季)。白天我在睡觉...

网友评论

      本文标题:唠唠 JNI string

      本文链接:https://www.haomeiwen.com/subject/earokrtx.html