25.2.5 通过JNI混合Java和C++(1)

2013-10-07 15:35:57 · 作者: · 浏览: 71

25.2.5  通过JNI混合Java和C++(www.cppentry.com)(1)

Java Native Interface(Java原生接口,JNI)是Java语言的一部分,允许程序员访问非Java语言编写的功能。由于Java是一种跨平台的语言,这个接口的初衷是让Java程序和操作系统交互。JNI也允许程序员使用其他语言编写的库,如C++(www.cppentry.com)。如果Java程序员在应用程序中有性能关键的部分,或者需要使用遗留代码,那么访问C++(www.cppentry.com)库的能力对Java程序员来说是非常有用的。

JNI也可以用于在C++(www.cppentry.com)程序中执行Java代码,但是这种用法很少见。因为这是一本C++(www.cppentry.com)的书,所以我们不会介绍Java语言。本节面向应该已经知道Java,而且想在Java代码中结合C++(www.cppentry.com)代码的读者。

下面以一个Java程序开始Java的跨语言之旅。对于这个例子,最简单的Java程序就足够了:

  1. public class HelloCpp {  
  2. public static void main(String[] args)  
  3. {  
  4. System.out.println("Hello from Java!");  
  5. }  
  6. }  
  7.  
  8. 代码取自JNI\HelloCpp.java  

接下来,需要声明一个用其他语言编写的Java方法。要做到这一点,使用native关键字并且不给出实现:
  1. public class HelloCpp {  
  2. // This will be implemented in C++(www.cppentry.com).  
  3. public native void callCpp();  
  4. // Remainder omitted for brevity  
  5. }  
  6.  
  7. 代码取自JNI\HelloCpp.java  

C++(www.cppentry.com)代码最终会被编译成一个共享库被动态加载到Java程序。您需要在一个Java静态块中加载这个库,这样才能在Java程序开始执行时加载这个库。您可以任意命名这个库,例如Unix系统上的hellocpp.so或Windows系统上的hellocpp.dll。
  1. public class HelloCpp {  
  2. static {  
  3. System.loadLibrary("hellocpp");  
  4. }  
  5. // Remainder omitted for brevity  
  6. }  
  7.  
  8. 代码取自JNI\HelloCpp.java  

最后,在Java程序中实际调用这段C++(www.cppentry.com)代码。callCpp() Java方法是一个占位符,表示尚未编写的C++(www.cppentry.com)代码。由于callCpp()是HelloCpp类的一个方法,需要创建一个新的HelloCpp对象并且调用这个对象的callCpp()方法:
  1. public class HelloCpp {  
  2. static {  
  3. System.loadLibrary("hellocpp");  
  4. }  
  5. // This will be implemented in C++(www.cppentry.com).  
  6. public native void callCpp();  
  7. public static void main(String[] args)  
  8. {  
  9. System.out.println("Hello from Java!");  
  10. HelloCpp cppInterface = new HelloCpp();  
  11. cppInterface.callCpp();  
  12. }  
  13. }  

这是Java这边所有的内容。现在,只需像往常一样编译Java程序:

  1. javac HelloCpp.java