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)

原文:http://blog.csdn.net/jiben071/archive/2010/11/26/6036305.aspx (一)在C/C++本地代码中创建JAVA对象1.java对象的创建(1...
  • GEOLO
  • GEOLO
  • 2011年04月22日 10:20
  • 2331

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

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

Java学习笔记4 —— 面向对象编程概念

面向对象编程概念 Ref: http://docs.oracle.com/javase/tutorial/java/concepts/index.html 什么是对象?     ...

疯狂JAVA讲义学习笔记4——面向对象1

定义类[修饰符] class 类名 { 零到多个构造器定义.. 零到多个Field… 零到多个方法… }修饰符 public protected private stati...
  • xundh
  • xundh
  • 2017年01月03日 22:58
  • 226

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

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

在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记)...

Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

Android 学习笔记——利用JNI技术在Android中调用、调试C++代码 博客分类:  JNI Android android  在Android中调用C++其实就是...

JNI学习笔记(二)--C++传递结构体、String、数组对象给Java

有时候我们需要传递结构体给Java,而Java中没有与结构体,我们可以用一个类来接受结构数据,下面用一个Demo来说明如果传递。...

六、Android学习笔记_JNI_c调用java代码

六、Android学习笔记_JNI_c调用java代码 1、编写native方法(java2c)和非native方法(c2java): package com.example.pr...

学习笔记之对象的创建(Java)

  • 2011年04月18日 14:32
  • 169KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI学习笔记4——本地代码创建Java对象(包括javaString)
举报原因:
原因补充:

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