`
George_ghc
  • 浏览: 93043 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNI技术使用指导(通过JNI技术实现java后台调用C++/c的dll文件)

阅读更多
编写带有native声明的方法的java类
•使用javac命令编译所编写的java类
•使用javah -jni java类名生成扩展名为h的头文件
•使用C/C++实现本地方法
•将C/C++编写的文件生成动态连接库
•ok

1) 编写java程序:这里以HelloWorld为例。
代码1:
class HelloWorld { 
public native void displayHelloWorld();
static { 
System.loadLibrary("hello"); 
} 
public static void main(String[] args) { 
new HelloWorld().displayHelloWorld(); 
}
}

声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。 Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
2) 编译没有什么好说的了 javac HelloWorld.java
3) 生成扩展名为h的头文件 javah -jni HelloWorld 头文件的内容(有的时候要先设置一下环境变量:set classpath="E:\.."):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
#include "jni.h"
#include "HelloWorld.h" 
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
{
printf("Hello world!\n"); 
return;
}

注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、 jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为 HelloWorldImpl.cpp就ok了。
5) 生成动态库这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.cpp文件夹下面,使用VC的编译器cl生成。 cl -I%java_home%\include -I%java_home%\include\win32 -I"%cpp_home%"\include -LD HelloWorldImpl.cpp -Fehello.dll 注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32 -I"%cpp_home%"\include参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件(引入了哪些文件就要加上包含这些文件的参数)。还要注意的一点是:添加环境变量LIB=%cpp_home%\lib(我机器上的cpp_home=E:\Program Files\Microsoft Visual Studio\VC98),因为需要与里面的一些lib文件链接。
6) 运行程序 java HelloWorld就ok.
分享到:
评论

相关推荐

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

    在这个DEMO中,我们看到有get()和set()两个方法,这些都是通过JNI调用C/C++实现的。在Java中,这些方法会声明为native,并且没有具体的实现。然后,使用`javah`工具,根据Java类生成相应的C/C++头文件。在C/C++代码...

    C++库封装JNI接口-实现java调用c++

    Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...

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

    JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的.dll或Linux下的.so文件)。JNI框架包括了Java端的本地方法声明和本地方法实现,以及C/C++端的...

    JAVA调用C++/C#的DLL

    标题"JAVA调用C++/C#的DLL"涉及到的技术点主要集中在Java Native Interface(JNI)上,这是一种允许Java代码与其他编程语言(如C++或C#)进行交互的标准机制。下面我们将深入探讨这一主题。 首先,JNI是Java平台的...

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

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    Java通过JNI调用C++的DLL文件.docx

    Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...

    Java JNI 调用C++ API/dll 示例程序

    完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...

    JAVA调用C/C++ DLL文件方法

    JAVA 调用 C/C++ 库文件(DLL)可以通过多种方式实现,包括 JNI、JNative、Jawin 和 Jacob 等。每种方式都有其特点和优缺,开发者可以根据实际情况选择合适的方式来实现 JAVA 与 C/C++ 之间的交互。

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    jni java调用c/c++

    Java 通过 JNI 调用 C/C++ 实现动态库加载 Java Native Interface (JNI) 是 Java虚拟机(JVM)提供的一种接口,允许 Java 代码和本地代码(如 C/C++)之间的交互。通过 JNI,Java 程序可以调用 C/C++ 代码,实现 ...

    JAVA项目JNI调用dll实现DEMO源码,C++&JAVA

    完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...

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

    标题中的"java写的一个使用jni调用c/c++的dll"意味着我们要创建一个Java项目,该项目包含一个或多个`native`方法,这些方法的实现将在C/C++中完成。接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了...

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    在windows中jni(生成dll)Linux中jni(生成so),java调用曾c++

    在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...

    非常好用java调用c++ dll文件demo

    Java调用C++ DLL文件是跨语言编程中的一个重要应用场景,特别是在既有Java代码库又有C++动态链接库的情况下。本文将详细讲解如何在Java程序中调用C++编写的DLL文件,以及一个可用的示例。 首先,理解Java与C++交互...

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

    在Java中,通过JNI接口,开发者可以定义native方法,并在C或C++代码中实现这些方法,以便调用DLL中的函数。这涉及到以下步骤: 1. 在Java类中声明native方法。 2. 使用javah工具生成C/C++头文件,该文件定义了JNI...

    [JAVA]使用JNI技术实现JAVA程序调用dll

    使用 JNI 技术实现 JAVA 程序调用 dll JAVA 语言的跨平台特性深受 Java 程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能。例如与一些硬件设备通信...

    JNI 调用实例(java JNI cpp互相调用实例)

    通过本文,我们可以了解 Java 和 C++ 之间的互相调用实例的实现过程,包括 C++ DLL 文件的创建和使用,以及 Java 代码中使用 JNI 技术调用 C++ DLL 文件的实现细节。这种技术可以应用于需要 Java 和 C++ 之间互相...

    springboot+jna/jni调用动态so/dll库

    在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...

    java使用JNI调用C++ dll库用法概述

    Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...

Global site tag (gtag.js) - Google Analytics