概述
?
当无法用 Java 语言编写整个应用程序时,JNI 允许您使用本机代码。在下列典型情况下,您可能决定使用本机代码:
希望用更低级、更快的编程语言去实现对时间有严格要求的代码。
?
希望从 Java 程序访问旧代码或代码库。
?
需要标准 Java 类库中不支持的依赖于平台的特性。
?
?
从 Java 代码调用 C/C++ 的六个步骤
?
从 Java 程序调用 C 或 C ++ 代码的过程由六个步骤组成。 我们将在下面几页中深入讨论每个步骤,但还是先让我们迅速地浏览一下它们。
?
?
1.编写 Java 代码。
我们将从编写 Java 类开始,这些类执行三个任务:声明将要调用的本机方法;装入包含本机代码的共享库;然后调用该本机方法。
?
2.编译 Java 代码。
在使用 Java 类之前,必须成功地将它们编译成字节码。
?
3.创建 C/C++ 头文件。
C/C++ 头文件将声明想要调用的本机函数说明。然后,这个头文件与 C/C++ 函数实现(请参阅步骤 4)一起来创建共享库(请参阅步骤 5)。
?
4.编写 C/C++ 代码。
这一步实现 C 或 C++ 源代码文件中的函数。C/C++ 源文件必须包含步骤 3 中创建的头文件。
?
5.创建共享库文件。
从步骤 4 中创建的 C 源代码文件来创建共享库文件。
?
6.运行 Java 程序。
运行该代码,并查看它是否有用。我们还将讨论一些用于解决常见错误的技巧。
?
?
故障排除
?
当使用 JNI 从 Java 程序访问本机代码时,您会遇到许多问题。您会遇到的三个最常见的错误是:
?
无法找到动态链接。
它所产生的错误消息是:java.lang.UnsatisfiedLinkError。这通常指无法找到共享库,或者无法找到共享库内特定的本机方法。
?
无法找到共享库文件。
当用 System.loadLibrary(String libname) 方法(参数是文件名)装入库文件时,请确保文件名拼写正确以及没有指定扩展名。还有,确保库文件的位置在类路径中,从而确保 JVM 可以访问该库文件。
?
无法找到具有指定说明的方法。
确保您的 C/C++ 函数实现拥有与头文件中的函数说明相同的说明。
?
?
结束语
?
从 Java 调用 C 或 C++ 本机代码(虽然不简单)是 Java 平台中一种良好集成的功能。虽然 JNI 支持 C 和 C++,但 C++ 接口更清晰一些并且通常比 C 接口更可取。
正如您已经看到的,调用 C 或 C++ 本机代码需要赋予函数特殊的名称,并创建共享库文件。当利用现有代码库时,更改代码通常是不可取的。要避免这一点,在 C++ 中,通常创建代理代码或代理类,它们有专门的 JNI 所需的命名函数。然后,这些函数可以调用底层库函数,这些库函数的说明和实现保持不变。
?
?详见:
http://www.ibm.com/developerworks/cn/education/java/j-jni/index.html
http://www.ibm.com/developerworks/cn/education/java/j-jni/section2.html