Zade's Weblog

程序人生

Monthly Archives: 5月 2010

JNI使用初步总结

最近由于和同事的合作,需要在C/C++和Java之间互调用,所以使用了JNI,现总结如下:

非技术因素:

  1. 互调用是集成的要求,集成因为是多人之间的合作,所以要尽量的减少交互的成本,非常核心的一点是在合作者之间确立明确的接口,双方要达成一致
  2. 对于个体而言,要进行充分的测试,这些测试一般分成两部分,一部分是同种语言接口的测试,这个是比较简单的,利用成熟的单元测试即可;令一部分是语言之间的测试,这部分相对比较复杂,需要搭建两个语言环境,调试起来也比较麻烦.这个时候,通过C/C++的接口实现的程序本身正确性就非常的关键了,如果C/C++的程序本身存在bug,但是是通过JNI接口调用发现的这个bug,那么代价是非常巨大的

技术因素:

  1. 语言之间的调用最主要的是类型转换,如从const char* 转换为jstring,从unsigned char*转换为jbyteArray等
  2. const char* 转换为jstring.  
    JNI显式的接口支持的是unicode之间的转换,但是实际中使用的经常是需要把unicode转换为本地码,例如GBK.网络上有不少这样的方法,其中非常流行的一个是使用win2的函数WideCharToMultiByte,这虽然正确,但是局限在windows平台上,让我感觉不爽.在java的官方网站上,有这方面的一些信息http://java.sun.com/docs/books/jni/html/other.html#26043,主要的技术要点是利用了java String本身的方法,这样越过了对平台的依赖.我在代码中就使用了这个方法.不过我的一个疑惑是JNIEnv这个对象提供这样的一个基础函数就好了,因为他很常用
  3. unsigned char*转换为jbyteArray.
    从JNIEnv初始化一个指定大小的字节数组:
  4. jbyteArray result = env->NewByteArray(size);
    jbyte* buf = env->GetByteArrayElements(result,0);
    memcpy(buf,&bytes[0],size);
    我原来的想法是到这里为止,就可以直接的返回result 了;但是实际上还需要执行:env->ReleaseByteArrayElements(result,buf,0).
    为什么和我原来的想法不一致呢?我认为这个维护应该在java的一端维护,但是java的一端是根本无从维护的,因为我们不能要求java一端区分一个字节数组来自于jni调用,还是直接的java语言本身,所以只能由C/C++一方维护.这个结论显然可以推广到jni的其他类似的接口上
    虽然如此,但是从C/C++这方来说,凡是需要返回的java对象,并不需要释放,例如上的result是需要返回给java方的,虽然从字眼来看,NewByteArray是创建的一个对象,这个对象好像也应该被释放,但是释放了又如何返回给java端呢;也就是说,这个对象是由java端来维护返回其生命周期和资源占用的

  5. JNI_OnUnload JNI_OnLoad.我现在知道了JNI_OnLoad的调用时机,但是JNI_OnUnload 还是不很清楚,虽然文档所有说明,但是从我的测试例子来看,那排是我调用了System.runFinalization(),JNI_OnUnload 也没有调用.这个问题可以以后再说吧,现在影响不大.

所谓的高雅艺术-阿什肯纳奇与英国爱乐乐团音乐会听后感

所里工会还有一部分钱剩下,秘书灵机一动,集体的订购了几张阿什肯纳奇与英国爱乐乐团音乐会的音乐会门票.这个决定引来了大家的不少非议,但是作为既成事实,总不能浪费吧,不到700块钱呢?

4.29是音乐会的播放时间,前一天,一位同事慷慨的吧她的门票给了我,这样我就可以和我的爱人一起去了,地点在国家大剧院.

我6点做地铁出发,7.20到达,提前了10分钟,时间上正好合适.到10点结束的时候,大约播放了2个半小时的时间.下面是曲目列表:

D大调小提琴协奏曲        勃拉姆斯  曲
小提琴演奏:吕思清
第二交响曲    拉赫玛尼诺夫 曲

在此之前,我没有听过如此高雅的音乐会.所以在播放期间,老婆偷偷的问我"感觉怎样的"时候,我还没有具体的体会,现在整理如下

  1. 从流程的角度来说,在这样高雅音乐会上,如果演奏者的技艺高超,那么观众的掌声就会很热烈.演奏者退场以后,如果掌声不停,那么演奏者要鞠躬谢意;如果掌声还是不停,那么演奏者一般要提供一个额外的曲目.在这次音乐会上,吕思清和爱乐乐团各自附加了一个曲目.我想这不应该是这次音乐会的特例,而是一个普遍的规律
  2. 因为是音乐会,所以至少从制度上来说,要杜绝拍照和手机铃声等.老婆在偷拍的时候,被工作人员制止了;而且整个音乐会场是一个手机信号隔离区.
  3. 我是一个门外汉,从我门外汉的角度来听,最精彩的时段是当一个曲目结束的时候,声音戛然而止,整个上万人的音乐大厅鸦雀无声,然后爆发出雷鸣般的掌声.至少从形式上表现了听众完全浸入其中,然后猛然惊醒的效果.我的身后是白发苍苍的老人,颇有艺术家的气度;身前是黄头发,蓝眼睛的老外,这样的氛围本身给人以庄重的感觉
  4. 爱国者的情怀.吕思清是中国人,这可能是组织者的有意为之,听众也把最热烈的掌声给了他.甚至有一些人表现了粉丝的疯狂,在吕思清小提琴演奏结束的时候,吹起了口哨. 或者是真的粉丝,或者是托吧,我阴暗的想到.
  5. 这样的一场音乐会当然是一场高雅的音乐会,在这样的场合,中国传统的二胡,三弦等好像拿不出台面.但是何谓高雅的艺术呢?或者更确切的说,正常高雅音乐会的特点是什么?
    • 团队的配合.这次爱乐乐团的总的成员大约有50人,相对于中国的二胡等独奏的乐器,这需要更多的配合,需要有伟大的团队精神.不仅在音乐层面上,在体育,IT等领域,缺乏团队配合时东方人的通病
    • 丰富的乐器设备,这包括大提琴,小提请,钢琴等的乐器种类.这也是团队配合的结果.
    • 享誉国际乐坛的指挥家,”阿什肯纳奇”,虽然那我没有听说过,但是书面上至少把他和理查德•施特劳斯、卡拉扬并列,这两位是我这个门外汉也知道的著名的音乐指挥家