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()方法