学习了一下JNI,发表文章的时候不知道该选什么好了,不知道JNI应该属于那个范畴^_^。
1.简介
JNI是Java
Native Interface的缩写,它的设计目的是:
The
standard Java
class library may not support the
platform-dependent features needed by your application.
You
may already have a library or application written in another programming
language and you wish to make it accessible to Java applications
You may want to implement a small portion of time-critical code in a
lower-level programming language, such as assembly, and then have your
Java application call these functions
2.JNI的书写步骤
编写带有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”是动态库的名字。
main()方法
2) 编译没有什么好说的了
javac HelloWorld.java
3)
生成扩展名为h的头文件
javah ?jni HelloWorld
头文件的内容:
/*
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:
1 #include <jni.h>
2 #include "HelloWorld.h"
3 #include <stdio.h>
4 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.c就ok
了。
5) 生成动态库
这里以在Windows
中为例,需要生
成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
cl
-I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c
-Fehello.dll
注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在
HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将
-I%java_home%\include
-I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
6) 运行程序
java HelloWorld就ok。^_^
分享到:
相关推荐
在这个实例中,我们将探讨如何使用JNI来调用C++接口。 首先,我们需要了解JNI的基本结构。在Java端,我们会定义一个native方法,这个方法没有具体的实现,而是通过`native`关键字标记。例如: ```java public ...
通过这个方法,开发者可以确保本地代码与JVM(Java虚拟机)的JNI接口兼容,防止因版本差异导致的问题。 接下来,我们关注的是五类主要的JNI操作: 1. **类操作**:这些操作涉及到Java类的定义和查找。`DefineClass...
最后,`使用JNI调用本地接口.doc`可能是详细的步骤文档,而`JavaUseDll`可能是一个Java示例程序,演示如何在Java代码中调用本地接口并传递中文字符串。运行这个程序,你可以看到JNI成功地处理了中文字符的传递。 ...
用 JNI 调用本地接口 作 者 : nxy1027@163.com在本文中,我们将深入探讨如何使用JNI(Java Native Interface)来调用本地接口,特别是在处理中文字符串时遇到的挑战。JNI是Java平台提供的一种机制,允许Java代码与...
### Java本地接口(JNI)编程指南和规范 #### 引言与背景 本书全面介绍了Java本地接口(JNI),这是连接Java代码与本地语言(如C和C++)编写的应用程序或库的重要桥梁。JNI旨在促进Java与其他编程环境之间的无缝集成...
### Java本地接口规范(JNI)详解 #### 一、Java本地接口的历史与演变 ##### JDK1.0的时代 在JDK1.0时代,本地接口(Native Interface)的设计较为初级,主要面向C语言结构,这使得Java在跨平台移植时遇到了挑战。...
Java本地接口(JNI)是Java平台的一个核心特性,它允许Java代码和其他语言编写的代码进行交互,特别是C和C++。JNI在Java的发展历程中扮演了重要的角色,它为Java应用程序提供了与本地操作系统和硬件直接通信的能力,...
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...
Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...
Java本地接口(JNI)是Java平台中一个重要的技术,它允许Java代码与其他语言编写的代码进行交互。具体而言,JNI允许Java代码调用本地应用程序接口(API),即那些用非Java语言(如C或C++)编写的库。此外,JNI还允许...
JNI(Java Native Interface)是Sun Microsystems公司定义的一套标准接口,用于实现Java代码与本地代码(通常是C或C++)之间的交互。随着Java的发展,JNI的重要性日益凸显,因为它允许Java程序调用本地库的功能,...
### Java本地方法接口(JNI)知识点详解 #### 一、引言 在现代软件开发领域,Java作为一种跨平台的语言,其强大的平台无关性和广泛的适用性让它成为许多项目的首选编程语言。然而,在某些特定场景下,如对性能有极高...
Java本地调用接口(Java Native Interface,简称JNI)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都扮演着关键角色,比如当需要访问操作系统特定功能、优化性能或者利用已...
当Java代码调用本地方法时,JVM会通过JNI接口找到相应的本地代码,并执行该代码。在Delphi中,我们需要编写C或C++的动态链接库(DLL),这个DLL将作为Delphi和Java之间的桥梁。 在Delphi 10.3中,我们可以使用...
JNI接口包括一系列的函数,如`FindClass`, `GetFieldID`, `CallVoidMethod`等,它们用于在Java和本地代码之间建立桥梁。 2. **创建C# DLL**: 在C#环境中,使用Visual Studio或其他开发工具创建一个新的类库项目,...