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

来源:互联网 发布:哈尔滨淘宝代运营 编辑:程序博客网 时间:2024/04/30 02:45

(一)在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);