本地代码创建Java对象(包括javaString)

使用字节码理解Java String的两种创建方式|从根上理解JavaString的两种创建方式 使用字节码理解Java String的两种创建方式。 1. 通过字节码理解Java String的两种创建方式 2. 理解两种创建方式的不同。 3. 加深理解Java的内存存储方式。 阅读详情

(一)在C/C++本地代码中创建JAVA对象
1.java对象的创建
(1)函数NewObject可以创建java对象
(2)GetMethodID能够取得构造方法的jmethodID,如果传入的要取得的方法名称设定为“<init>”就能够取得构造方法
(3)构造方法的方法返回值类型的签名始终为Void
(4)例子:
jclass clazz_date = env->FindClass("java/util/Date");
jmethodID mid_date = env->GetMethodID(clazz_date,"<init>","()V");//构造函数ID
jobject now=env->NewObject(clazz_date,mid_date);//创建java对象
(5)另一种方法——> AllocObject(不常用)

(二)在C/C++本地代码中访问JAVA的String字符串对象
(1)在java中,使用的字符串String对象不论是中文还是英文符号,一个字符总是占两个字节
(2)java通过JNI接口可以将java的字符串转换到C/C++中的宽字符串(wchar_t*),或是传回一个UTF-8的字符串(char*)到C/C++.

反过来,C/C++可以通过一个宽字符串,或是一个UTF-8编码的字符串来创建一个java端的String对象
(3)函数
GetStringChars
GetStringUTFChars
这两个函数用来取得某个jstring对象相关的Java字符串。

分别可以取得UTF-16编码的宽字符串(jchar*)跟UTF-8编码的字符串(char*)。

例如:
const jchar* GetStringChars(jstring str,jboolean* copied)
const char* GetStringUTFChars(jstirng str,jboolean* copied)
第一个参数传入一个指向java中的String对象的jstring变量
第二个参数传入一个jboolean的指针

这两个函数分别都会有两个不同的动作:
1.开新内存,然后把java中的string拷贝到这个内存中,然后返回指向

这个内存地址的指针
2.直接返回指向java中String内存的指针,这个时候千万不要改变这个

内存的内容,这将破坏String在java中始终是常量这个原则。

第二个参数是用来标识是否对java的String对象进行了拷贝
如果传入这个jboolean指针不是NULL,则它会给该指针所指向的内存

传入JNI_TRUE或JNI_FALSE标识是否进行了拷贝
传入NULL表示不关心是否拷贝字符串,它就不会给jboolean*指向的内

存赋值

使用这两个函数取得的字符串,在不使用的时候,要使用

ReleaseStringChars/ReleaseStringUTFChars来释放拷贝的内容,或

是释放对java的String对象的引用


ReleaseStringChars(jstring jstr,const jchar * str);
ReleaseStringUTFChars(jstring jstr,const char * str);
第一个参数指定一个jstring变量,即是要释放的本地字符串的来源
第二个参数就是要释放的本地字符串

(4)GetStringCritical
1.为了增加直接传回指向java字符串的指针的可能性(而不是拷贝),

JDK1.2出来了新的函数GetStringCritical/ReleaseStringCritical.
2.在GetStringCritical/ReleaseStringCritical之间是一个关键区,在关键区千万不要出现中断操作,

或是在JVM中分配任何新对象,否则会造成JVM死锁
3.虽说这个函数会增加直接传回指向java字符串指针的可能性,不过还是会根据实际情况传回拷贝过的字符串
4.不支持GetStringUTFCritical

(5)GetStringRegion/GetStringUTFRegion
1.动作:把java字符串的内容直接拷贝到C/C++的字符数组中。在呼叫这个函数之前必须有一个C/C++分配出来的字符串,

然后传入到这个函数中进行字符串的拷贝(此函数不分配内存)
2.例子
//拷贝Java字符串并以UTF-8编码传入buffer
GetStringUTFRegion(jstring str,jsize start,jsize len,char* buffer);
//拷贝java字符串并以UTF-16编码传入buffer
GetStringRegion(jstring str, jsize start,jsize len,jchar* buffer);


(三)在C/C++本地代码中创建JAVA的String字符串对象
1.函数
jstring NewString(const jchar* str,jsize len);
jstring NewStringUTF(const char * str);
//取得字符串的长度
jsize GetStringLength(jstring str);
jsize GetStringUTFLength(jstring str);

JNI创建java对象 这是我用于测试,主要用于jni创建java对象病操作 立即下载

相关推荐

Win10下Delphi 10.4.2 (RAD Studio 10.4.2 )安装教程图解

Win10下Delphi 10.4.2 (RAD Studio 10.4.2 )安装和破解教程图解

1万+

JNI学习笔记4——本地代码创建Java对象(包括javaString)

(一)在C/C++本地代码中创建JAVA对象1.java对象的创建(1)函数NewObject可以创建java对象(2)GetMethodID能够取得构造方法的jmethodID,如果传入的要取得的方法名称设定为“”就能够取得构造方法(3)构造方法的方法返回值类型的签名始终为Void(4)例子:jclass clazz_date = env->FindClass("java/util/Date");jmethodID mid_date = env->GetMethodID(clazz_date,"","()

jiben071的专栏 4892

SpringBoot实战——仿b站项目(一)

热部署就是当应用程序这种运行的时候升级冉家或者修改某一部分代码、配置文件时,无需手动启动应用,即可修改的部分生效工具 + IDEA配置。

weixin_52880572的博客 3455

Java中String为什么可以不用new?

1. jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串常量池,用来存储字符串常量。 2. 使用String直接赋值: String str=“abc”:可能创建一个或者不创建对象,如果”abc”在字符串池中不存在,会在java字符串池中创建一个String对象(”abc”),然后str指向这个内存地址,无论以后用这种方式创建多少个值为”abc”的字符串对象,始终只有一个内存地址被分配。 3.使用new String()赋值: String str=newStrin

琉璃的博客 3372

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6119

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

Android Jni笔记--创建一个String

JNIEXPORT jstring JNICALL Java_cn_edu_zafu_jnidemo_Test_getName(JNIEnv * env, jobject jObj){ jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !"); return str; }

程序员的良师益友 1071

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 418

JNI内通过参数形式从C/C++中传递string类型数据至Java层

​类似之前我写过的两篇文章:一篇介绍了在JNI中基础类型int的传值方式;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C++中传递一维、二维、三维数组数据至Java层详细梳理_nanke_yh的博客-优快云博客 JNI内形参从C代码中获取返回值并返回到Java层使用-优快云博客 这篇则主要是讲JNI中String类型的数据如何通过参数的形式传递数据值。

nanke_yh的博客 2305

在 ABAP CDS View 里把 Conversion Functions 用到极致:FLTP 精度、单位换算、货币换算与小数位处理的工程化实践

数据格式转换在真实项目中比业务逻辑更容易引发问题。ABAP CDS中的转换函数(如FLTP_TO_DEC、UNIT_CONVERSION、CURRENCY_CONVERSION和DECIMAL_SHIFT)可帮助在数据库层统一数据口径,避免应用层重复处理。这些函数支持数值精度治理、单位换算、货币转换和小数位调整,能显著提升报表性能并减少逻辑分散。通过将格式转换前移到数据模型层,可以确保服务层和UI层的数据一致性,同时降低接口传输错误风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2350

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4453

JNI中jstring操作

http://blog.sina.com.cn/s/blog_80c9582b0100so65.html 使用JNI时,最常见的操作是将jstring转换成UTF字符串。JNI提供了几个转换函数:GetStringUTFChars,GetStringUTFRegion。 GetStringUTFChars返回一个指向UTF字符串的指针,该函数会分配内存空间存储该字符串,因此使用完后

RandyLeonard的专栏 2261

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1390

JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组

转自:http://blog.youkuaiyun.com/jiben071/article/details/6033613 JNI学习笔记1——开篇 JNI——java native interface (一)开篇 1.为什么要使用jni     Java有些时候需要调用本地代码(C/C++),jni接口提供了 java与操作系统本地代码互相调用的功能   2.最简单的j

Skypine_Lee的专栏 1234

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java string对象创建_关于java:创建了多少个对象,包括String对象

本问题已经有最佳答案,请猛点这里访问。有人能告诉我创建了多少个对象吗?S3是否引用了字符串池中的相同hello?有多少个字符串对象/****/package agnitio;/*** @author admin**/public class TestString {/*** @param args*/public static void main(String[] args) {// TODO A...

weixin_33140809的博客 229

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JavaString String对象

创建一个String对象,语法:new String(stringValue),这个调用会将参数转换为字符串,并作为一个String对象。事实上任何一个字符串常量都是一个String对象,可以将其直接作为对象来使用,这和使用newString()创建对象的区别是:typeof的返回值不同,一个是“stirng",另一个是"object".string.indexOf(searchString,po

Bino's Blog  938

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

javaString类

声明字符串 在Java中是由字符串必须包含在一对双引号“”之内 e:"你好" "Helle,word" 语法:String str;String :指定该变量为字符类型 str : 变量名 注意:在Java中由双引号包围的都是字符串,不能作为其他数据类型 而且字符串变量必须经过初始化才能使用 否则会报出:"变量未初始化错误" 创建字符串: 在Java语言中将字符串作为对象来管理,因此...

weixin_45736498的博客 263

javaString类超详解

String类 1.声明 2、创建字符串 ①创建字符串对象 ②字符串的存储形式 ③字符串对象在内存中的布局 3、连接字符串 ①连接字符串 ②连接其他类型 4、获取字符串信息 ①获取字符串长度 ②字符串子串查找 ③获取指定下标的字符 5、字符串操作方法 ①获取子字符串 ②去除空格 ③字

随便写点C++和JAVA的知识 1258

javaString创建方式及其存储差异

String类创建方式俩种: String name1 = "Tom"; String name2 = "Tom"; //== 引用数据类型中比较地址而不是字符串 System.out.println(name1==name2);//输出的是ture,比较的是地址 String name3 = new String("lucy"); String name4 = new String(...

syhfly2333的博客 221

JavaString类

/* 接口 接口中只有常量和抽象方法 * 常量 默认 类型public static final 接口中定义时,写不写都是这样 * 方法的默认类型 public abstract StringBuilder * String类是不可变字符序列 * StringBuilder是可变字符序列,线程不安全类,但是运行效率高,最常用 * String Buffer是可变字符序列,是线程安全类...

ojemmm的博客 941

javaString类引用

public class 测试 { public static void main(String[] args) { // TODO Auto-generated method stub String s="a"; String t="b"; if(s==t) { System.out.println("引用相同"); }else { System.out.pr...

cookie_plus的博客 430

JavaString题目练习

* 通过new创建的字符串对象,没一次new都会申请一个内存空间,虽然内容相同,但是地址值不同 char[] ch = {'a','b','c'}; * String s1 = new String(ch); String s2 = new String(ch); * 上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容相同的 * * 以""方式给出的字符串,只要字符串序列相同(顺序和大小写...

xdh1996的博客 368

javaString

以Java为例,Java的泛型是在JDK 5中引入的,它只支持在编译时进行类型检查,而在运行时,泛型信息会被擦除(Type Erasure),即泛型信息不会进入到JVM的运行时环境中。泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。:通过泛型,可以编写更通用的代码,这些代码可以被不同类型的对象所复用。

2303_81990289的博客 537
上一篇: CVS 提示错误的意思
下一篇: 本地方法取得Java属性/调用java方法
vrix
博客等级 码龄24年 673粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值