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程序就足够了:
- public class HelloCpp {
- public static void main(String[] args)
- {
- System.out.println("Hello from Java!");
- }
- }
-
- 代码取自JNI\HelloCpp.java
接下来,需要声明一个用其他语言编写的Java方法。要做到这一点,使用native关键字并且不给出实现: - public class HelloCpp {
- // This will be implemented in C++(www.cppentry.com).
- public native void callCpp();
- // Remainder omitted for brevity
- }
-
- 代码取自JNI\HelloCpp.java
C++(www.cppentry.com)代码最终会被编译成一个共享库被动态加载到Java程序。您需要在一个Java静态块中加载这个库,这样才能在Java程序开始执行时加载这个库。您可以任意命名这个库,例如Unix系统上的hellocpp.so或Windows系统上的hellocpp.dll。- public class HelloCpp {
- static {
- System.loadLibrary("hellocpp");
- }
- // Remainder omitted for brevity
- }
-
- 代码取自JNI\HelloCpp.java
最后,在Java程序中实际调用这段C++(www.cppentry.com)代码。callCpp() Java方法是一个占位符,表示尚未编写的C++(www.cppentry.com)代码。由于callCpp()是HelloCpp类的一个方法,需要创建一个新的HelloCpp对象并且调用这个对象的callCpp()方法: - public class HelloCpp {
- static {
- System.loadLibrary("hellocpp");
- }
- // This will be implemented in C++(www.cppentry.com).
- public native void callCpp();
- public static void main(String[] args)
- {
- System.out.println("Hello from Java!");
- HelloCpp cppInterface = new HelloCpp();
- cppInterface.callCpp();
- }
- }
这是Java这边所有的内容。现在,只需像往常一样编译Java程序:
- javac HelloCpp.java