java中的字符串类型是String,对应的jni类型是jstring,由于jstring是引用类型,所以我们不能像基本数据类型那样去使用它,我们需要使用JNIEnv中的函数去处理jstring,下面介绍一些常用的字符串处理函数。

  1.GetStringUTFChars()

//作用:将jstring类型转化为c中的const char *类型
//参数说明:
//string:jstring类型字符串
//isCopy:两种取值,JNI_TRUE/JNI_FALSE;JNI_TRUE表示返回的是c字符串是java类型字符串的拷贝,JNI_FALSE表示c字符串直接指向java字符串;实际开发中,我们不关心这个值是什么,直接传入nullptr即可
const char* GetStringUTFChars(jstring string, jboolean* isCopy)
{ return functions->GetStringUTFChars(this, string, isCopy); }

  2.ReleaseStringUTFChars()

//作用:用于释放通过GetStringUTFChars()函数获取的c字符串的内存,使用完这个c字符串之后一定要用这个函数释放内存,防止内存泄漏
//参数说明:
//string:jstring类型的字符串
//utf:对应的c字符串
void ReleaseStringUTFChars(jstring string, const char* utf)
{ functions->ReleaseStringUTFChars(this, string, utf); }

  3.NewStringUTF()

//作用:将c字符串转化为jstring类型
jstring NewStringUTF(const char* bytes)
{ return functions->NewStringUTF(this, bytes); }

  4.NewString()

//作用:将utf-16字符数组转化为jstring字符串
//参数说明:
//unicodeChars:字符数组
//len:字符数组的长度
jstring NewString(const jchar* unicodeChars, jsize len)
{ return functions->NewString(this, unicodeChars, len); }

  5.GetStringUTFLength()

//作用:获取jstring字符串的utf-8编码字符串长度
jsize GetStringUTFLength(jstring string)
{ return functions->GetStringUTFLength(this, string); }

  6.GetStringLength()

//作用:获取jstring字符串的utf-16编码字符串长度
jsize GetStringLength(jstring string)
{ return functions->GetStringLength(this, string); }

  7.GetStringChars()

//作用:将jstring类型的字符串转化为utf-16编码的字符数组
const jchar* GetStringChars(jstring string, jboolean* isCopy)
{ return functions->GetStringChars(this, string, isCopy); }

  8.ReleaseStringChars()

//释放由GetStringChars()函数获取的字符数组的内存
void ReleaseStringChars(jstring string, const jchar* chars)
{ functions->ReleaseStringChars(this, string, chars); }

  9.GetStringRegion()

//用于从Java字符串对象中获取指定范围的UTF-16编码的字符数据并存储在一个字符数组中
void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)
{ functions->GetStringRegion(this, str, start, len, buf); }

  10.GetStringUTFRegion()

//用于从Java字符串对象中获取指定范围的UTF-8编码的字符数据并存储在一个字符数组中
void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)
{ return functions->GetStringUTFRegion(this, str, start, len, buf); }

  

  

    

  

  

JNI编程之字符串处理的更多相关文章

  1. Android jni 编程1(对基本类型字符串的操作)

    最近一直在学安卓的jni,主要参考的是黑马程序员的视频教程,讲的确实不错. 那就自己总结一下吧,算是对学习的复习. 这篇博客也主要参考了这位博主:http://www.cnblogs.com/acti ...

  2. JNI编程(二) —— 让C++和Java相互调用(2)

    3.getRamdomOrder() 这个方法会从backend得到一个随机的Order对象(抱歉这里“Random”拼错了),然后再调用java中相应的通知方法来通知foreground.getRa ...

  3. JNI编程(二) —— 让C++和Java相互调用(1)

    自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...

  4. Android中JNI编程的那些事儿(1)

    转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...

  5. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  6. JNI编程实现(Linux)

    JNI是Java Native Interface的缩写,是Java平台的本地调用,从Java1.1就成为了Java标准的一部分,它允许Java代码和其它语言的代码进行互相调用,只要调用约定支持即可, ...

  7. 解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...

  8. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  9. Android jni 编程入门

    本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...

  10. 在 JNI 编程中避免内存泄漏

    JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...

随机推荐

  1. 我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater

    我们现在使用SpringBoot 做Web 开发已经比之前SprngMvc 那一套强大很多了. 但是 用SpringBoot Web 做API 开发还是不够简洁有一些. 每次Web API常用功能都需 ...

  2. 上班第一天 Android 环境配置

    其实是昨天把大概 回归Android开发第一天 学会查 然后等待 反正我是不希望以后再查了 写出来吧 去谷歌那边把android studio下载下来 更新jdk版本(与传统的java开发不同 高版本 ...

  3. 普通用户启动 supervisor 报 HTTP 错误(strace)

    公司的开发对生产环境都有普通用户 www 的权限,采用堡垒机登录到生产环境的机器. 默认 supervisor 使用 root 用户启动,开发没有权限直接修改配置和操作 supervisor 管理的进 ...

  4. bitfield

    bitfield 作用 位域修改 溢出控制 原理 通过对redis字符串二进制形式进行操作,通过改变其值的作用 更具体 将一个Redis字符串看作是一个由二进制位组成的数组. 并能对变长位宽和任意没有 ...

  5. linux 问题: ssh登录报错,ssh_exchange_identification,多次几次可以登录

    分析 怀疑是句柄数不够,和ssh的最大登录限制 确认 2.1 确认句柄数 过程: ~# systemctl status sshd | grep -i pid Main PID: 3767395 (s ...

  6. 2022-1-10 控件学习1 TextBlock、Lable、TextBox

    TextBlock LineBreak:在指定位置手动换行和<br/>类似 TextTrimming: CharacterEllipsis没有足够空间时显示...,WordEllpsis以 ...

  7. error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/

    解决办法: python3 是用 VC++ 14 编译的, python27 是 VC++ 9 编译的, 安装 python3 的包需要编译的也是要 VC++ 14 以上支持的.可以下载安装这个:vi ...

  8. Vu3+Element-Plus根据路由配置生成菜单导航栏

    先看效果,整体界面结构如下 点击左侧菜单栏,右侧切换显示不同页面内容. Vue3使用路由–南河小站 1 路由配置 路由配置如下: const routes = [ { path: "&quo ...

  9. HDU 3829 Cat VS Dog 猫和狗(二分图)结题报告

    听学长说这道题很ex,但是思路想到的话还是挺简单的. 可能是受上一道题(放置机器人)的启发,也是找互相冲突的点连线. 但是并不是完全一样(废话)放置机器人那道题是找到冲突点连线后直接求最大匹配即可. ...

  10. 在Jupyter中使用AI写代码,如有神助,太惊艳了

    昨晚看到一个可以在JupyterLab中使用的AI代码辅助工具jupyter-ai,它的交互确实非常棒,可以直接聊天,也可以就笔记中的代码提问,最出彩的是生成笔记功能,还是蛮惊艳的. 这里就极简介绍一 ...