快速业务通道

访问JNI函数:JNIEnv自变量 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25

访问JNI函数:JNIEnv自变量

时间:2007-05-29 yycnet.yeah.net yyc译

利用JNI函数,程序员可从一个固有方法的内部与JVM打交道。正如大家在前面的例子中看到的那样,每个JNI固有方法都会接收一个特殊的自变量作为自己的第一个参数:JNIEnv自变量——它是指向类型为JNIEnv_的一个特殊JNI数据结构的指针。JNI数据结构的一个元素是指向由JVM生成的一个数组的指针;该数组的每个元素都是指向一个JNI函数的指针。可从固有方法的内部发出对JNI函数的调用,做法是撤消对这些指针的引用(具体的操作实际很简单)。每种JVM都以自己的方式实现了JNI函数,但它们的地址肯定位于预先定义好的偏移处。利用JNIEnv自变量,程序员可访问一系列函数。这些函数可划分为下述类别:■获取版本信息■进行类和对象操作■控制对Java对象的全局和局部引用■访问实例字段和静态字段■调用实例方法和静态方法■执行字串和数组操作■产生和控制Java异常JNI函数的数量相当多,这里不再详述。相反,我会向大家揭示使用这些函数时背后的一些基本原理。欲了解更详细的情况,请参阅自己所用编译器的JNI文档。若观察一下jni.h头文件,就会发现在#ifdef _cplusplus预处理器条件的内部,当由C++编译器编译时,JNIEnv_结构被定义成一个类。这个类包含了大量内嵌函数。通过一种简单而且熟悉的语法,这些函数让我们可以从容访问JNI函数。例如,前例包含了下面这行代码:(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);它在C++里可改写成下面这个样子:jEnv->ReleaseStringUTFChars(jMsg,msg);大家可注意到自己不再需要同时撤消对jEnv的两个引用,相同的指针不再作为第一个参数传递给JNI函数调用。在这些例子剩下的地方,我会使用C++风格的代码。

1. 访问Java字串作为访问JNI函数的一个例子,请思考上述的代码。在这里,我们利用JNIEnv的自变量jEnv来访问一个Java字串。Java字串采取的是Unicode格式,所以假若收到这样一个字串,并想把它传给一个非Unicode函数(如printf()),首先必须用JNI函数GetStringUTFChars()将其转换成ASCII字符。该函数能接收一个Java字串,然后把它转换成UTF-8字符(用8位宽度容纳ASCII值,或用16位宽度容纳Unicode;若原始字串的内容完全由ASCII构成,那么结果字串也是ASCII)。GetStringUTFChars是JNIEnv间接指向的那个结构里的一个字段,而这个字段又是指向一个函数的指针。为访问JNI函数,我们用传统的C语法来调用一个函数(通过指针)。利用上述形式可实现对所有JNI函数的访问。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号