从 Java 程序调用 C/C++ 代码

概述

 

当无法用 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值