`
hejiajunsh
  • 浏览: 402011 次
  • 性别: 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技术手册 c/c++调用java

    V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载...

    JNI学习示例代码,含java代码工程和win32 dll工程

    即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/...

    如何使用Eclipse编译C,C++,JAVA程序

    如何使用Eclipse编译C,C++,JAVA程序

    JNI使用规范详解.pdf

    即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/...

    eclipse 开发c/c++

    代码模板:由代码辅助功能使用的代码模板是标准 C/C++ 语言语法结构的定义。您也可以定义自己的代码模板来扩展您自己的快捷键,如用于 author 或 date 关键字的快捷键。在 Window => Preferences => C/C++ => Code ...

    java,c/c++,php,c#安全编码规范

    java,c/c++,php,c#安全编码规范,从代码层面避免被入侵 1 业务安全编码规范 6 1.1 输入验证和数据合法性校验 6 1.1.1 避免SQL注入 6 1.1.2 避免XML注入 6 1.1.3 避免跨站点脚本(XSS) 7 1.1.4 避免跨站请求伪造...

    Android项目_jni操作指南.rar

    3. Java与C/C++的交互:详细阐述了如何在Java代码中调用C/C++编写的本地方法,以及在C/C++中回调Java方法的具体实现。 4. 本地代码的编译与部署:介绍了如何将C/C++代码编译成动态链接库(.so文件),并将其部署到...

    C调用java详解和源代码

    C调用java程序详解和源代码,前一阵子,趁有机会了解了JNI的一些东西,并按我的方法对JNI做了些封装,我就可以在C++ 中调用一些java写的功能了

    细说Android4.0NDK编程.pdf

    本书顺应Android软/硬件、云计算整合潮流,详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android NDK开发环境的每一步细节,开发第一个Android NDK程序,Android NDK中Java与C/C++代码的互相调用,Facade设计...

    JNI实例 Java调用DLL c++调用Java

    该Demo有两个主要的例子,一个实现的是在java程序中调用DLL中的方法;而一个则是讲述如何在C++代码中调用Java类中的方法、详细阐述了JNI机制的使用,是一个很好的学习例子。

    S/KEY协议的简单模拟(C语言)

    对S/KEY协议的简单模拟(其中的哈希函数都懒的写,直接调用的rand),C语言代码,通过DEV-C++编译,献给写实验报告的童鞋。

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    Java本地调用c+opencv生成的DLL

    和我一篇博文相关联的程序。 主要是用java本地调用c+opencv生成的dll dll已经生成好了,生成dll的代码还不方便放网上,有机会在分享吧。。。

    使用RationalPureCoverage诊断C/C++程序覆盖信息和用户环境的集成

    在Linux、UNIX和Windows上都可使用和集成,PureCoverage支持C/C++、Java、.NET、VisualBasic和HTML。它可以实时诊断出应用程序覆盖的函数或方法(包括调用次数)和代码行信息。1概述 RationalPureCoverage是专门...

    java加壳的问题

    以前我认为这是不可能的,因为动态加载代码这样的内存级别的操作,java无法做到,除非使用JNI(Java Native Interface),调用自己编写的C代码,在C代码中实现动态加载java代码。但是,C如何加载java代码呢?这需要对...

    java数据库连接方法和实现

     本地API驱动 这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等)来访问数据库,而在驱动程序中则包含了Java代码。 类型3  网络协议驱动 这种类型的驱动给客户端提供了一个网络API,客户端上的...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,他的著作独具风格,无论是编程新手,还是经验丰富的编程人员,都很容易理解其内容。在个人实践中,Ivor Horton也是一名系统顾问。他从事...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 301 11.3.2 公共子表达式消除 / 305 11.3.3 数组边界检查消除 / 307 11.3.4 方法内联 / 307 11.3.5 逃逸分析 / 309 11.4 Java与C/C++的编译器对比 / 311 11.5 本章小结 / 313 第五部分 高效并发 第12章 ...

Global site tag (gtag.js) - Google Analytics