【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

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

转载 2012年03月29日 17:54:20

原文:http://blog.csdn.net/jiben071/archive/2010/11/26/6036305.aspx

 

(一)在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学习笔记4——本地代码创建Java对象(包括javaString)

(一)在C/C++本地代码中创建JAVA对象1.java对象的创建(1)函数NewObject可以创建java对象(2)GetMethodID能够取得构造方法的jmethodID,如果传入的要取得的方...

学习笔记4——hibernate中模型对象的三种状态

hibernate中session管理持久化对象时候的三种状态转变 分别为:1、transient 透明状态 2、persistent 持久化状态 3、detached托管状态 [code="java"] @Test public void testHibernateWith3Status(){ Teacher t = new Teacher() ; t.setName("laoshi") ; t.setTitle("超级") ; //视频28 //此时t为状态1 transient状态,只在内存中存在,没有ID,也不在Session缓存中。

Java之学习笔记——面向对象编程_笔记4

个人理解,编程中所谓的 类¨ 与现实世界中对物体的分门别类中的类是同一个概念,只是在编程中将其借用进来。类代表有一系列共性和相同操作或动作的事物,在编程中即为抽象的数据类型。具体的每个个体(现实世界中...

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

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

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

转自:http://blog.csdn.net/jiben071/article/details/6033613 JNI学习笔记1——开篇 JNI——java native i...

Spring.NET学习笔记4——对象的创建(基础篇)

学过了前面的课程,我们来一起学习Spring.NET的IoC容器对象的创建。  创建对象一般有3种方式:1.构造器创建,2.静态工厂创建,3.实例工厂创建  多数情况下,容器会根据对象定义中的type属性值去直接调用相应类型的某个构造器。另外,容器也可以调用工厂方法来创建对象,这时type属性的值就应该是包含工厂方法的类型(按:而不是要创建的类型,但通过该对象定义的名称获取的则是由工厂方法所创建的对象)。工厂方法的产品对象可以是工厂方法所在的类型,也可以是其它类型(按:很多情况下工厂方法位于单独的类型中),这无关紧要。(摘自Spring.NET中文手册)<

Spring.NET学习笔记4——对象的创建(基础篇) Level 200

学过了前面的课程,我们来一起学习Spring.NET的IoC容器对象的创建。   创建对象一般有3种方式:1.构造器创建,2.静态工厂创建,3.实例工厂创建   多数情况下,容器会根据对象定义中的...

《Java面向对象编程》学习笔记4——操作符简介

1.注意"=" "==" "!="还能操作各种引用类型。而"+"除了可以操作包含Boolean类型以外的基本数据类型外,还可以操作string类型。 2.多数操作符都是从左到右运算的,但是赋值操作是从右到左。 3.整型操作符在计算表达式时,若一个操作元是long,那么结果也是long,否则不管操作元是byte还是short、char,运算结果都是int。 4.算术右移位操作符&gt;&gt; 符号位是0的左端就补零(正数),否则补一。a&gt;&gt;b等价于(a/2)^(b%32).

JNI学习笔记——创建JAVA对象和内部类需注意

跨过了基本类型和基本类型数组的坑后,迈入字符串和

臧圩人:JAVA面试题解惑系列(二)——到底创建了几个String对象学习笔记

1.我们常用的创建一个类的实例(对象)的方法有以下两种:    (1)使用new创建对象。    (2)调用Class类的newInstance方法,利用反射机制创建对象。   2.在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。   3.St
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)