日期:2011-03-22 16:16:00 来源:本站整理
传送和操纵Java对象[Java编程]
本文“传送和操纵Java对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在前例中,我们将一个字串传送给固有办法.事实上,亦可将自己成立的Java对象传送给固有办法.
在我们的固有办法内部,可拜候已收到的那些对象的字段及办法.
为传送对象,声明固有办法时要采取原始的Java语法.以下例所示,MyJavaClass有一个public(大众)字段,以及一个public办法.UseObjects类声明了一个固有办法,用于接纳MyJavaClass类的一个对象.为调查固有办法能否能掌握自己的自变量,我们设置了自变量的public字段,调用固有办法,然后打印出public字段的值.
class MyJavaClass { public void divByTwo() { aValue /= 2; } public int aValue; } public class UseObjects { public static void main(String [] args) { UseObjects app = new UseObjects(); MyJavaClass anObj = new MyJavaClass(); anObj.aValue = 2; app.changeObject(anObj); System.out.println("Java: " + anObj.aValue); } private native void changeObject(MyJavaClass obj); static { System.loadLibrary("UseObjImpl"); } }
编译好代码,并将.class文件传送给javah后,便可以实现固有办法.在下面这个例子中,一旦获得字段和办法ID,就会通过JNI函数拜候它们.
除第一个自变量外,C++函数会接纳一个jobject,它代表Java对象引用“固有”的那一面——那个引用是我们从Java代码里传送的.我们简单地读取aValue,把它打印出来,改变这个值,调用对象的divByTwo()办法,再将值重新打印一遍.JNIEXPORT void JNICALL Java_UseObjects_changeObject( JNIEnv * env, jobject jThis, jobject obj) { jclass cls; jfieldID fid; jmethodID mid; int value; cls = env->GetObjectClass(obj); fid = env->GetFieldID(cls, "aValue", "I"); mid = env->GetMethodID(cls, "divByTwo", "()V"); value = env->GetIntField(obj, fid); printf("Native: %d\n", value); env->SetIntField(obj, fid, 6); env->CallVoidMethod(obj, mid); value = env->GetIntField(obj, fid); printf("Native: %d\n", value); }
为拜候一个字段或办法,首先必须获得它的标识符.操纵得当的JNI函数,可便利地获得类对象、元素名以及签名信息.这些函数会返回一个标识符,操纵它可拜候对应的元素.固然这一方法显得有些崎岖,但我们的固有办法确切对Java对象的内部筹划一无所知.因此,它必须通过由JVM返回的索引拜候字段和办法.这样一来,差别的JVM便可实现差别的内部对象筹划,同时不会对固有办法造成影响.
若运行Java程序,就会发现从Java那一侧传来的对象是由我们的固有办法处理的.但传送的毕竟是什么呢?是指针,还是Java引用?并且垃圾汇集器在固有办法调用期间又在做什么呢?
垃圾汇集器会在固有办法履行期间持续运行,但在一次固有办法调用期间,我们的对象可保证不会被当作“垃圾”汇集去.为确保这一点,事前成立了“部分引用”,并在固有办法调用之后当即排除.由于它们的“生命期”与调用历程息息相关,所以可以保证对象在固有办法调用期间的有效性.
由于这些引用会在每次函数调用的时刻成立和破坏,所以不可在static变量中制作固有办法的部分副本(本地拷贝).若但愿一个引用在函数存在期间持续有效,就需求一个全局引用.全局引用不是由JVM成立的,但通过调用特定的JNI函数,程序员可将部分引用扩大为全局引用.成立一个全局引用时,需对引用对象的“生存时间”负责.全局引用(以及它引用的对象)会一向留在内存里,直到用特定的JNI函数明确释放了这个引用.它近似于C的malloc()和free().
以上是“传送和操纵Java对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论