`
hejiajunsh
  • 浏览: 410332 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

从 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

分享到:
评论

相关推荐

    使用JNI进行混合编程:在Java中调用C/C++本地库

    通常,它会先编译Java代码,然后编译C/C++代码,最后运行Java程序,确保本地库被正确加载并调用。 5. **源码分析**: - Sample1.java包含了Java类和本地方法的声明。 - Sample1.cpp包含了本地方法的实现,它会...

    jni java调用c/c++

    通过 JNI,Java 程序可以调用 C/C++ 代码,实现 Java 与 native 代码的交互。 在本例中,我们将详细介绍如何使用 JNI 将 Java 代码与 C/C++ 代码集成,生成动态库,并加载到 Java 程序中。 JNI 概述 JNI 提供了一...

    java调用C/C++全过程

    下面我们将详细介绍如何从Java端发起调用到本地C/C++代码的全过程: 1. **定义本地方法**: 在Java类中定义一个或多个本地方法,并使用`native`关键字标记,表示这些方法将在本地代码中实现。 ```java public ...

    java调用C/C++过程

    总结起来,Java调用C/C++的过程涉及到Java本地方法的声明、JNI头文件的生成、C/C++代码的编写和编译,以及最终的Java程序调用。这个过程对于Java开发者深入理解和优化应用性能至关重要。在实践中,还需要掌握JNI的...

    Java 调用C/C++程序

    总之,Java调用C/C++程序的能力通过JNI得以实现,这是一种强大的技术,使得Java应用能够充分利用本地系统的资源,同时也保留了Java的跨平台优势。虽然使用JNI会增加代码的复杂性,但其灵活性和性能提升对于许多项目...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    通过以上步骤,我们就可以在Java程序中成功地调用C或C++编写的DLL库了。这个过程虽然涉及多个环节,但理解了JNI的工作原理后,你会发现这并不是一项复杂任务。对于那些需要利用C/C++高性能特性的Java应用,JNI是一个...

    java调用C/C++的例子

    总结起来,这些资源可以帮助开发者深入理解和实践Java通过JNI调用C/C++的技术,涵盖了从理论到实战的各个方面。通过学习和使用这些材料,开发者可以有效地将Java应用程序与C/C++库集成,提升程序的性能和功能。

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    JNI为Java程序提供了一种机制,使得Java代码可以声明native方法,这些方法在Java虚拟机之外实现,通常在C或C++中编写。JNI头文件和源代码生成器`javah`用于生成C/C++的头文件,这个头文件定义了Java类中的native方法...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    这些函数实现了Java native方法的逻辑,并可能调用到系统库或其他C/C++代码。 3. 生成的SO库(`.so`):这是编译后的动态链接库,包含了你的C/C++代码。在Android设备上运行时,这个库会被Java层加载,Java方法通过...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

    java写的一个使用jni调用c/c++的dll

    本文将深入探讨如何使用Java通过JNI调用C/C++编写的DLL动态链接库。 首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码...

    android调用C/C++

    在Android平台上,调用C或C++代码是通过Java Native Interface (JNI) 实现的,这是一种允许Java代码与本地库交互的技术。JNI已经成为Android开发者在性能关键领域,如图形处理、游戏引擎、加密算法等中引入C/C++代码...

    java调用c c++程序实例

    5. 运行Java程序,调用native方法。 通过这种方式,开发者可以利用Java的高级特性同时利用C/C++的高效性能,实现两者的完美结合。在实际应用中,这常用于图形处理、硬件访问、高性能计算等场景。

    JNI学习指南(java 调用C/C++接口)

    为了弥补这一缺陷,Java Native Interface (JNI) 应运而生,它允许Java代码调用C/C++编写的本地代码。本文旨在提供一份详尽的JNI学习指南,帮助初学者理解如何在Java中调用C/C++接口。 #### 二、JNI的基本原理 JNI...

    JNA调用c/c++库示例

    本示例将详细介绍如何使用JNA在Java程序中调用C/C++库。 首先,理解JNA的基本工作原理。JNA的核心是`com.sun.jna.Library`接口,这个接口定义了调用本地方法的规范。你需要创建一个类实现这个接口,并声明你想要...

    java调用C和C++

    通过JNI,Java程序可以有效地调用C/C++代码,这不仅扩大了Java的应用范围,还提高了程序的执行效率。虽然JNI的使用过程中存在一定的复杂性和潜在的风险,但只要合理设计和谨慎实施,就能够充分发挥其优势。希望本文...

    JNI技术手册 c/c++调用java

    通过以上详细的步骤和技术要点,我们可以看到,无论是Java调用C/C++还是C/C++调用Java,都需要仔细地处理数据类型转换、异常处理以及性能优化等问题。掌握这些技术细节,对于开发高效稳定的跨语言应用程序至关重要。

    android studio项目java C/C++ 相互调用

    它定义了一套API,让Java代码可以调用C/C++函数,反之亦然。在Android中,JNI是实现Java和C/C++交互的关键。 2. **创建NDK项目** 在Android Studio中,可以通过创建一个新的Android Studio项目,并选择包含C/C++...

    Java programming with JNI

    本教程将涵盖JNI最常见的两种应用场景:从Java程序调用C/C++代码以及从C/C++程序调用Java代码。我们将详细介绍JNI的基础知识,并讨论一些更高级的编程挑战。 #### 二、从Java程序调用C/C++代码 在许多情况下,开发...

Global site tag (gtag.js) - Google Analytics