闂備浇銆€閸嬫捇鏌熼婊冾暭妞ゃ儻鎷� (0) +1 闂佽崵濮嶅鍡楊伓 (0) +1 闂傚倸饪存禍鐑藉箯閿燂拷 (0) +1
闂備浇銆€閸嬫捇鏌熼婊冾暭妞ゃ儲鍨块弻鐔衡偓娑櫭慨鍥р攽椤曞棙瀚�闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑缂佲晠鏌熼婊冾暭妞ゃ儻鎷�>>

正在阅读:如何在Linux平台下使用JNI提高Java效率如何在Linux平台下使用JNI提高Java效率

2005-07-21 10:16 出处: 作者:张翼翔 李庆明 责任编辑:moningfeng

  参数:array 数组对象

  elems 不再需要的指向数组元素的指针

  mode 0=在更新数组元素后释放elems缓冲器

  JNI_COMMIT=在更新数组元素后不释放elems缓冲器

  JNI_ABORT=不更新数组元素释放elems缓冲器

  例如:

  void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems, jint mode)
  xxxArray NewXxxArray(jsize len)


  产生一个新的数组,通常在反值类型为数组型时用到。


  参数:len 数组中元素的个数。

  例如:

  jbooleanArray NewBooleanArray(jsize len)



  3、编译生成共享库。

  使用GCC时,必须通知编译器在何处查找此Java本地方法的支持文件,并且显式通知编译器生成位置无关的代码,在我的环境中按如下过程编译:

  gcc-I/home/jbuilder/jdk1.3.1/include-I/home
  /jbuilder/jdk1.3.1/include/linux -fPIC -c Hello.c


  生成Hello.o

  gcc -shared -Wl,-soname,libhello.so.1
  -o libhello.so.1.0 Hello.o


  生成libhello.so.1.0

  接下来将生成的共享库拷贝为标准文件名

  cp libhello.so.1.0 libhello.so



  最后通知动态链接程序此共享文件的路径。

  export LD_LIBRARY_PATH=`pwd`
  :$LD_LIBRARY_PATH



  4、编写一个简单的Java程序来测试我们的本地方法。

  将如下源码存为ToSay.java:

  import Hello;
  import java.util.*;
  public class ToSay
  {
  public static void main(String argv[])
  {
  ToSay say = new ToSay();
  }
  public ToSay()
  {
  Hello h = new Hello();
  //调用本地方法向John问好
  h.SayHello("John");
  }
  }


  用javac编译ToSay.java,生成ToSay.class向执行普通Java程序一样使用java ToSay,我们会看到在屏幕上出现Hello,John。到这里我们就将整个的本地调用编写过程大概浏览了一遍。

应用中注意事项

  1.如果可以通过TCP/IP实现Java代码与本地C/C++代码的交互工作,那么最好不使用以上提到的JNI的方式,因为一次JNI调用非常耗时,大概要花0.5~1个毫秒。

  2.在一个Applet应用中,不要使用JNI。因为在 applet 中可能引发安全异常。

  3.将所有本地方法都封装在单个类中,这个类调用单个 DLL。对于每种目标操作系统,都可以用特定于适当平台的版本替换这个 DLL。这样就可以将本地代码的影响减至最小,并有助于将以后所需的移植问题包含在内。

  4.本地方法要简单。尽量将生成的DLL 对任何第三方运行时 DLL 的依赖减到最小。使本地方法尽量独立,以将加载DLL 和应用程序所需的开销减到最小。如果必须要运行时 DLL,则应随应用程序一起提供它们。

  5.本地代码运行时,没有有效地防数组越界错误、错误指针引用带来的间接错误等。所以必须保证保证本地代码的稳定性,因为,丝毫的错误都可能导致Java虚拟机崩溃。

结束语

  JNI调用规范给我们复用原有其它语言的代码提供了简单易用的接口,可以节省大量的财力,使我们可以在享受Java带来的开发速度的同时,不必放弃旧有资源。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂備礁缍婂ḿ褔顢栭崱妞绘敠闁逞屽墴閹鎷呴崨濠備淮濠碘槅鍋撻幏锟�闂備焦鎮堕崕鎶藉磻濞戙垹鏄ラ悘鐐板嫎娴滄粓鏌涢锝嗙闁告棑鎷�