JNI初识

1 在java类中定义Native方法,private native void print(); 必须有Native修饰符,表明此方法是被其它语言实现,没有方法体即{}

2 在调用native方法之前,实现这个方法的库(.dll or .so)必须被加载,即在静态代码块中加载,它会在所有方法执行前调用。static{system.load(...)}

3 java_promt_getLine(JNIEnv *env,object this,jstring arg);

  *env:是一个指向JNI fuction table 的指针。table的对应指针再指向JNI方法

   this:如果是一个Instance就是这个对象自己。如果实现些方法的是静态类,则就是这个类

  因为string是java的java.lang.string类型的实例,它并不是基本类型。所以我们看到的arg并不是string类型,而是在java虚拟机中的string的地址。所以用的时候需要通过

  GetStringUTFchars()方法转换成C中的string(char * 类型),而GetStringUTFchars()这类JNI方法对 *env指针可见

  通过JNI方法获取的数据,在C中要进行检查,因为在Java虚拟机中出现异常,c是看不到的,而java抛出异常也是在执行完native方法

  最后要记得释放资源,也是通过(*env)-->RelaseStringUTFchar()方法等

4 为了能从java虚拟机中获取直接的指针,我们用Get/RelaseStringCritical方法。这个方法运行中会阻止虚拟机的垃圾回收器启动。它也为锁定当前进程,全其它线程也不能启动新

 的线程,直接这块结束,此过程中为防止死锁情况发生,些中不要调用其它JNI方法。在此块只允许调用Get/RelasePrimitiveArrayCritical.因为GetStringUTF()等方法是让虚拟机

  copy一份string。所以没有Get/RelaseStringUTFCritical()方法

posted @ 2011-01-17 23:54  IT圈儿  阅读(233)  评论(0)    收藏  举报