在java中通过JNI调用本地方法
只使用java语言显然不能满足所有的应用场景,例如要调用操作系统的一些资源、访问硬
件设备等,java就显得捉襟见肘,但是java在这方面也提供JNI(Java Native Interface)机制来适应这种要求。
如何使用JNI呢?
第一步:编写带有native声明的方法的java类
第二步:使用javac命令编译所编写的java类
第三步:使用javah命令生成扩展名为h的头文件
第四步:使用c/c++实现本地方法
第五步:将c/c++编写的文件生成动态连接库
(1)编写java类
代码如下:
public class tempdll{
static {
//加载动态库,这里的Hello表示的是动态连接文件的名称
//动态连接文件可以是dll文件(windows)或者so文件(liunx)
System.loadLibrary("Hello");
}
//声明本地方法
public native static int sayHello();
public static void main( String[] args ){
tempdll temp = new tempdll();
//调用本地的方法
System.out.println(temp.sayHello());
}
}
(2)编译tempdll类
在命令行中使用javac工具编译tempdll类文件,如下
javac tempdll.java (一定要配置好jdk的环境变量)
(3)生成.h的头文件
在命令行中使用javah工具生成.h的头文件,如下
javah tempdll
生成的内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class tempdll */
#ifndef _Included_tempdll
#define
_Included_tempdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: tempdll
* Method: sayHello
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_tempdll_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
一些说明
JNIEXPORT:是关键字,表示此函数是要被JNI调用的
jint:返回类型
函数的名称是JAVA_再加上java程序的package路径再加函数名组成的
第四步:使用c/c++实现本地方法
这里选择使用c语言实现本地方法,建立tempdll.cpp的文件,内容如下
#include "tempdll.h"
int i = 100;
JNIEXPORT jint JNICALL Java_tempdll_sayHello(JNIEnv *, jclass){
return i;
}
第五步:生成动态连接库文件
这一步就是将tempdll.h 文件和tempdll.cpp文件生成动态连接库文件
当然你可以使用相应的工具在命令行中做这个事情。
我选择使用VC环境来做,怎么做呢?
需要在VC中建立动态连接工程,此工程的名字必须是“Hello”,然后
将tempdll.h和tempdll.cpp文件拷贝到目录工程中,然后将文件导
入工程中,编译后就可以生成Hello.dll文件。
将Hello.dll文件拷贝到和tempdll.class文件的相同目录中
在命令行中使用java tempdll 搞定。
分享到:
相关推荐
使用`System.loadLibrary`加载C++编译生成的动态链接库,然后就可以在Java代码中调用本地方法,间接实现对C# DLL的调用。 7. **测试与调试**: 创建一个简单的Java应用程序来调用这些本地方法,测试C# DLL的功能...
当Java代码调用本地方法时,JVM会通过JNI接口找到相应的本地代码,并执行该代码。在Delphi中,我们需要编写C或C++的动态链接库(DLL),这个DLL将作为Delphi和Java之间的桥梁。 在Delphi 10.3中,我们可以使用...
总结来说,这个实例展示了Java通过JNI调用C++本地方法的基本流程,包括Java端的声明、JNI头文件的生成、C++的实现、动态链接库的编译以及最终的调用。虽然这个实例没有涉及复杂的类型转换,但在实际应用中,根据数据...
将生成的本地库与Java类一起打包成jar文件,然后在Java程序中加载这个库,就可以调用本地方法了。例如: ```java public class Main { public static void main(String[] args) { new NativeDemo().callFrom...
用 JNI 调用本地接口 作 者 : nxy1027@163.com在本文中,我们将深入探讨如何使用JNI(Java Native ...通过这些步骤和技巧,我们可以成功地在Java中通过JNI调用本地接口,同时处理中文字符串,实现跨语言的高效通信。
通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用程序与 C++ DLL 文件集成。 标题解析 本文的标题“Java 通过 JNI 调用 C++ 的 DLL 文件”表明了文章的主要内容,即使用...
在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...
Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...
JNI(Java Native Interface)就是为了弥补这一不足,它允许Java代码调用本地方法,这些方法通常以库文件的形式存在,如Windows上的DLL(Dynamic Link Library)或UNIX上的SO(Shared Object)文件。通过JNI,Java...
在本教程中,我们将深入探讨如何在Java程序中通过JNI调用Visual Studio 2005(VS2005)编译的C++代码。这个过程包括几个关键步骤,包括创建C++库、编写Java的JNI接口、编译C++代码以及在Java程序中加载和调用本地...
下面将详细解释如何使用JNI调用本地方法的步骤。 1. **编写Java中的调用类** 在Java中,你需要创建一个类并声明你想要调用的本地方法。这些方法前面会标记为`native`,例如: ```java package hxzon.jni; ...
4. **Java中调用本地方法** - 在Java类中声明`native`关键字修饰的函数,这些函数将在JNI头文件中生成对应的方法声明。 - 加载本地库:使用`System.loadLibrary`加载之前生成的DLL(Windows)或SO(Linux)库。 -...
最后,`使用JNI调用本地接口.doc`可能是详细的步骤文档,而`JavaUseDll`可能是一个Java示例程序,演示如何在Java代码中调用本地接口并传递中文字符串。运行这个程序,你可以看到JNI成功地处理了中文字符的传递。 ...
通过以上步骤,你就可以在Java应用程序中利用JNI调用IC卡读卡器的DLL,实现读取和写入IC卡的功能。注意,调用DLL可能会涉及线程安全、错误处理以及资源管理等问题,所以在实际应用中需要仔细考虑这些因素。此外,...
总结起来,JNI调用C++代码的过程包括:在Java中声明本地方法、生成JNI头文件、编写C++实现、编译C++代码为动态链接库,以及在Java程序中加载和调用本地方法。这种方式在处理底层操作、高性能计算或者与硬件设备交互...
JNI接口定义了一组函数,Java代码可以通过这些函数调用本地方法,反之,本地方法也可以通过这些函数调用Java方法。在Java代码中,我们需要使用`System.loadLibrary("name")`来加载本地库,并声明`native`关键字标记...
在本文中,我们将深入探讨如何在Visual Studio 2019环境下使用C++通过Java Native Interface (JNI)来调用Java代码。JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用...
5. **加载并调用本地库**:在Java代码中通过`System.loadLibrary`方法加载本地库,并调用之前声明的本地方法。 #### 三、环境配置 为了实现JNI,需要准备以下环境: 1. **Android NDK**:包含完整的Android编译器...
JNI接口提供了在本地代码中创建、访问和修改Java对象的方法,使得开发者可以将C/C++或者Delphi等本地代码嵌入到Java应用程序中。 要实现Delphi通过JNI调用Java函数,我们需要以下步骤: 1. **设置环境**:确保Java...