2012年12月22日

关于局部引用引起的虚拟机挂掉问题

该文被密码保护。 阅读全文

posted @ 2012-12-22 15:42 Cynthia&Sky 阅读(6) 评论(0) 推荐(0) 编辑

使用 JNI 时容易出错的地方相关总结

摘要: 把 jclass 和 jobject 弄混 一开始使用 JNI 时,很容易把对象引用(jobject 类型的值)和类引用(jclass 类型的值)弄混。对象引用对应的是数组或者 java.lang.Object 及其子类的对象实例,而类引用对应的是java.lang.Class 的实例。像 GetFieldID 这样需要传入 jclass 作为参数的方法做的是一个类操作,因为它是从一个类中获取字段的描述。而 GetIntField 这样需要传入 jobject 作为参数的方法做的是一个对象操作,因为它从一个对象实例中获取字段的值。混淆 ID 和引用本地代码中使用引用来访问 JAVA 对象,使用 阅读全文

posted @ 2012-12-22 15:29 Cynthia&Sky 阅读(705) 评论(0) 推荐(1) 编辑

JNI引用

摘要: JNI提供了一些实例和数组类型(jobject、jclass、jstring、jarray 等)作为不透明的引用供本地代码使用。本地代码永远不会直接操作引用指向的 VM内部的数据内容。要进行这些操作,必须通过使用 JNI操作一个不透明的引用来间接操作数据内容。因为只操作引用,你不必担心特定 JVM中对象的存储方式等信息。合理地管理 JNI引用是写出高质量的代码的基础。1.JNI 支持三种引用:局部引用、全局引用、弱全局引用(下文简称“弱引用”)。2.局部引用和全局引用有不同的生命周期。当本地方法返回时,局部引用会被自动释放。而全局引用和弱引用必须手动释放。3.局部引用或者全局引用会阻止 GC回 阅读全文

posted @ 2012-12-22 14:38 Cynthia&Sky 阅读(2749) 评论(0) 推荐(1) 编辑

JNI操作JAVA 中的字段和方法时的效率

摘要: 后面有介绍如何缓存ID 来提高效率后,那我们可能会对使用 JNI访问java字段和方法的效率不太明白,native/java 比起java/native和java/java来的话,效率如何呢? 当然,这取决于VM 的实现。我们不能给出在大范围的 VM上通用的数据,但我们可以通过分析本地方法回调 java方法和JNI 操作字段以及方法的过程来给出一个大致的概念。 我们从比较java/native 和java/java的效率开始。java/native调用比java/java要慢,主要有以下几个原因: 1、java/native比起 JVM内部的java/java 来说有一个调用转换过程,在把控制 阅读全文

posted @ 2012-12-22 14:11 Cynthia&Sky 阅读(1835) 评论(0) 推荐(0) 编辑

缓存字段ID和方法ID

摘要: 获取字段ID和方法ID时,需要用字段、方法的名字和描述符进行一个检索。检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗。缓存字段ID和方法ID的方法主要有两种。两种区别主要在于缓存发生的时刻,是在字段ID和方法ID被使用的时候,还是定义字段和方法的类静态初始化的时候。 也就是使用时缓存 还是 类的静态初始化过程中缓存字段和方法ID 使用时缓存 字段ID和方法ID可以在字段的值被访问或者方法被回调的时候缓存起来。下面的代码中把字段ID存储在静态变量当中,这样当本地方法被重复调用时,不必重新搜索字段ID:JNIEXPORT void JNICALL Java_Instance. 阅读全文

posted @ 2012-12-22 14:07 Cynthia&Sky 阅读(1205) 评论(0) 推荐(0) 编辑

调用JAVA方法

摘要: 实例方法的调用JNI 支持一系列完整的函数让你可以在本地代码中回调 JAVA 方法,下面例子演示了如何从本地代码中调用一个JAVA 中的实例方法:class InstanceMethodCall { private native void nativeMethod(); private void callback() { System.out.println("In Java"); } public static void main(String args[]) { InstanceMethodCall c = new... 阅读全文

posted @ 2012-12-22 13:52 Cynthia&Sky 阅读(3016) 评论(0) 推荐(0) 编辑

访问JAVA中的字段(jfieldID)

摘要: JAVA 支持两种 field(字段),每一个对象的实例都有一个对象字段的复制;所有的对象共享一个类的静态字段。访问对象字段:先看一个从本地代码中访问对象字段的例子: class InstanceFieldAccess { private String s; private native void accessField(); public static void main(String args[]) { InstanceFieldAccess c = new InstanceFieldAccess(); c.s = "a... 阅读全文

posted @ 2012-12-22 13:37 Cynthia&Sky 阅读(10110) 评论(0) 推荐(0) 编辑

访问数组(JNI)

摘要: JNI在处理基本类型数组和对象数组上面是不同的。对象数组里面是一些指向对象实例或者其它数组的引用。基本类型数组:获取数组元素指针的对应关系: 函数 数组类型 GetBooleanArrayElements boolean GetByteArrayElements byte GetCharArrayElements char GetShortArrayElements short GetIntArrayElements int GetLongArrayElements long GetFloatArrayElemen... 阅读全文

posted @ 2012-12-22 11:26 Cynthia&Sky 阅读(16703) 评论(0) 推荐(0) 编辑

字符串(JNI)

摘要: 从java程序中传过去的String对象在本地方法中对应的是jstring类型,jstring类型和c中的char*不同,所以如果你直接当做char*使用的话,就会出错。因此在使用之前需要将jstring转换成为c/c++中的char*,这里使用JNIEnv的方法转换.下面是访问String的一些方法:GetStringUTFChars将jstring转换成为UTF-8格式的char*GetStringChars将jstring转换成为Unicode格式的char*ReleaseStringUTFChars释放指向UTF-8格式的char*的指针ReleaseStringChars释放指向Un 阅读全文

posted @ 2012-12-22 10:57 Cynthia&Sky 阅读(19367) 评论(0) 推荐(0) 编辑

JNI本地接口相关参数说明(JNIEnv)

该文被密码保护。 阅读全文

posted @ 2012-12-22 10:42 Cynthia&Sky 阅读(13) 评论(0) 推荐(0) 编辑

jni学习相关

该文被密码保护。 阅读全文

posted @ 2012-12-22 10:07 Cynthia&Sky 阅读(12) 评论(0) 推荐(0) 编辑

导航