JNI编程之字符串处理

jni,编程,字符串,处理 · 浏览次数 : 20

小编点评

**String Handling Functions in Java** **1. `GetStringUTFChars()`** - 将jstring类型转换为c中的const char *类型 - 使用JNIEnv中的`functions->GetStringUTFChars()`函数获取c字符串 - 传递nullptr即可获取java字符串的副本 **2. `ReleaseStringUTFChars()`** - 用于释放通过`GetStringUTFChars()`函数获取的c字符串的内存 - 使用JNIEnv中的`functions->ReleaseStringUTFChars()`函数释放内存 **3. `NewStringUTF()`** - 将c字符串转换为jstring类型 - 使用JNIEnv中的`functions->NewStringUTF()`函数创建新的jstring字符串 **4. `NewString()`** - 将utf-16字符数组转换为jstring类型 - 使用JNIEnv中的`functions->NewString()`函数创建新的jstring字符串 **5. `GetStringUTFLength()`** - 获取jstring字符串的utf-8编码字符串长度 - 使用JNIEnv中的`functions->GetStringUTFLength()`函数获取长度 **6. `GetStringLength()`** - 获取jstring字符串的utf-16编码字符串长度 - 使用JNIEnv中的`functions->GetStringLength()`函数获取长度 **7. `GetStringChars()`** - 将jstring类型的字符串转化为utf-16编码的字符数组 - 使用JNIEnv中的`functions->GetStringChars()`函数获取字符数组 **8. `ReleaseStringChars()`** - 释放由`GetStringChars()`函数获取的字符数组的内存 - 使用JNIEnv中的`functions->ReleaseStringChars()`函数释放内存 **9. `GetStringRegion()`** - 从Java字符串对象中获取指定范围的UTF-16编码的字符数据并存储在字符数组中 - 使用JNIEnv中的`functions->GetStringRegion()`函数获取字符数据 **10. `GetStringUTFRegion()`** - 从Java字符串对象中获取指定范围的UTF-8编码的字符数据并存储在字符数组中 - 使用JNIEnv中的`functions->GetStringUTFRegion()`函数获取字符数据 **Note:** - These functions require the Java Native Interface (JNI) to be installed and configured. - JNI is a thin layer that allows Java to communicate with native code. - The `>` symbol is used to pass pointers to the corresponding native parameters.

正文

  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编程之字符串处理相似的内容:

JNI编程之字符串处理

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

[转帖]聊聊jvm的Code Cache

https://www.jianshu.com/p/b064274536ed 本文主要研究一下jvm的Code Cache Code Cache JVM生成的native code存放的内存空间称之为Code Cache;JIT编译、JNI等都会编译代码到native code,其中JIT生成的na

[转帖]聊聊jvm的Code Cache

https://juejin.cn/post/6844903809932591112 序 本文主要研究一下jvm的Code Cache Code Cache JVM生成的native code存放的内存空间称之为Code Cache;JIT编译、JNI等都会编译代码到native code,其中JI

【Android逆向】IDA动态调试JNI_OnLoad 和 .init_array

由于 JNI_OnLoad 和 .init_array 执行时间很早,so一加载到内存中就执行了,所以动态调试步骤会稍微要麻烦一些 1. 进入手机, 执行./android_server (如果是64位程序执行./android_server64) 2. 再开一个终端,执行adb forward t

[转帖]密集计算场景下的 JNI 实战

https://www.jianshu.com/p/ab8fd26014c1 作者:vivo 互联网服务器团队- Wei Qianzi、Li Haoxuan 在 Java 发展历程中,JNI 一直都是一个不可或缺的角色,但是在实际的项目开发中,JNI 这项技术应用的很少。在笔者经过艰难的踩坑之后,终

EPAI手绘建模APP介绍

​ 本软件是一个基于OpenCASCADE、android JNI开发的APP。底层用c++实现,UI层用android实现。底层和UI层之间通过JNI接口和json数据格式通信。 UI层包括资源管理器、编辑器、创建模型、工具栏四个部分。具体来说,包括模型列表、图层列表、相机列表、灯光列表、颜色库、

ADVMP 三代壳(vmp加固)原理分析(执行流程)

由于在加壳时插入了System.loadLibrary("advmp");,看一下JNI_OnLoad JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; if (vm->GetEnv

【Android逆向】静态分析+frida破解test2.apk

有了上一篇的基础 https://www.cnblogs.com/gradyblog/p/17152108.html 现在尝试静态分析的方式来处理 为什么还要多此一举,因为题眼告诉了我们是五位数字,所以可以爆破,不告诉这个题眼的话,就得分析 1. IDA 打开libroysue.so,查看JNI_O

【Android逆向】定位native函数在哪个so中方法

1. 在逆向过程中经常需要定位方法在哪个so中,而app加载的so很多,比如 那么如何快速定位方法在哪里呢 2. 比如如下案例,首先看日志 03-28 11:01:56.457 14566 14566 D KM-NATIVE: JNI_OnLoad 03-28 11:01:56.457 14566

[转帖]Core dump实战分析之Java版

https://www.jianshu.com/p/2cdf71f99209 Core dump实战分析(Java版) 背景 项目中的battleserver进程在某一段时间总是crash,无法找到具体Crash原因 Java通过JNI调用Luajit 那么进程Crash如何找到JNI的堆栈(C层)