`

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

 
阅读更多

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

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    基于JAVA本地监听与远程端口扫描的毕业设计,通过JAVA的ServerSocket类,创建ServerSocket对象并绑定

    本地端口监听实现通过JAVA的ServerSocket类,创建ServerSocket对象并绑定要监听的本地端口,然后通过accept()方法接受连接请求,在新线程中处理请求。具体代码如下: ServerSocket ss = new ServerSocket(6666); //监听...

    Java开发技术大全(500个源代码).

    useOnlyTest.java 创建多个对象,演示this的作用 useStaticBolck.java 使用静态块 useStVar.java 使用静态成员变量 第4章 示例描述:本章学习继承与多态。 absClass.java 抽象类定义示例 ancestor.java 基类...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java6string源码-buildobjects:将定义构建为Java代码

    java6string源码构建对象 buildobjects 是一个基于对象的通用构建工具 buildobjects 提供了许多 Java 类,允许您以真正面向对象的方式编写构建过程。 它不会强迫您采用某种方式来构建代码和项目。 相反,它旨在提供...

    java语言与面向对象程序设计作业题与参考答案汇编.doc

    答案:正确 第18题 Java程序里,创建新的类对象用关键字new,回收无用的类对象使用关键字free。 答案:错误 第19题 类及其属性、方法可以同时有一个以上的修饰符来修饰。 答案:正确 第20题 有的类定义时可以不定义...

    java jdk实列宝典 光盘源代码

    java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频文件,以及控制声音的大小和音量,Beep.java; 媒体播放器,JMFMediaPlayer.java; 12反射 是java程序开发的特征之一,允许java程序对自身...

    疯狂JAVA讲义

    学生提问:构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象? 141 5.5.2 构造器的重载 142 学生提问:为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    超级有影响力霸气的Java面试题大全文档

     JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要...

    Java优化编程(第2版)

    5.2 创建带有本地方法的java应用 5.3 创建c端代码 5.3.1 创建c端代码头文件 5.3.2 创建c端代码主文件 5.4 jni技术中数据类型与处理方法 5.4.1 jni技术中的本地数据类型 5.4.2 访问jni本地数据类型的方法 5.4.3 在jni...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    java面试宝典

    创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中...

Global site tag (gtag.js) - Google Analytics