JNI是Java Native Interface的缩写,JAVA本地调用。从jdk1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。看过JDK源代码的人肯定会注意到在源码里有很多标记成native的方法。这些个方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。他提供了一个调用(invoke)的接口,然后用C或者C++去实现;
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
GCC:(GNU Compiler Collection,GNU编译器套装)是一套支持多种编程语言的编译器。GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。GCC原名为GNU C编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,并支持处理C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go等。
GCC编译后缀名:
.c为后缀的文件,C语言源代码文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
C编译后缀名:
头文件后缀名: .h
源文件后缀名: .c
C++编译后缀名:
头文件后缀名: .h, .hpp, .hxx
源文件后缀名:.cpp, .cc, .cxx, .C .c++
新建项目JNI
package org.nickfover.jni; public class Demo1 { public native void say(String str); }
E:\ECLIPSEWORKPALCE\JNI\src>javac org/nickfover/jni/Demo1.java
E:\ECLIPSEWORKPALCE\JNI\src>javah org.nickfover.jni.Demo1
返回src目录:
打开c++开发工具VC 6,新建一个Win32 Dynamic-Link library项目,取名为JAVAJNI;
将org_nickfover_jni_Demo1.h文件拷贝到这个工程目录下;将<jni.h>修改为"jni.h"
在项目里新建一个c++source file ,内容如下:
#include <iostream.h> #include "org_nickfover_jni_Demo1.h" JNIEXPORT void JNICALL Java_org_nickfover_jni_Demo1_say (JNIEnv *, jobject, jstring) { cout << "Hello, " << endl; }
效果图:
这时编译会报错,将*/java/include下的jni.h和jni_md.h也拷贝到工程目录下:
现在执行编译build(F7); 在debug目录就会生成一个JAVAJNI.dll文件;现在将这个文件拷贝到java库中;
1、查看java库:
System.out.println( System.getProperty("java.library.path"));
列出了一些java的库,拷贝到其中的一个;比如我拷贝到:D:\ZmyExe\java\bin\JAVAJNI.dll
2.测试:
package org.nickfover.jni; public class Demo1 { static{ System.loadLibrary("JAVAJNI"); //加载dll文件 } public native void say(String s); public static void main(String[] str){ new Demo1().say("1"); } }
输出:
Hello,
调用dll文件成功;
也可以直接将JAVAJNI.dll文件放在java工程目录下:
传递参数需要了解数据类型在内存中的表示,后跟进
相关推荐
在IT领域,跨语言通信是常见的需求之一,而C++与Java之间的交互就涉及到了Java Native Interface (JNI)。本文将深入探讨如何使用C++创建Java虚拟机(JVM),并通过JNI来调用Java函数。这是一项技术性很强的任务,...
在这个"Jvm.rar_jni_jni线程_jvm"的压缩包中,我们主要探讨的是JNI与Java线程的交互。 首先,JNI的核心是定义了一套接口,让Java代码可以创建本地方法(Native Method),这些方法可以在C/C++中实现。在"Jvm.cpp"这...
JNI 是一种标准的接口,用于 Java virtual machine(JVM)与 native 代码之间的交互。JNI 允许 Java 代码调用 native 代码,并且 native 代码也可以调用 Java 代码。JNI 的主要用途是: 1. 访问 native 资源,例如...
`jni.pas`和`JNI_MD.INC`一起使用,可以帮助Delphi开发者构建能够在Java虚拟机(JVM)上运行的本地代码模块。 在Delphi中使用JNI,开发者可以实现以下功能: 1. **调用Java方法**:通过JNI,Delphi代码可以直接调用...
### Java与JNI结合获取系统进程信息的实现 #### 概述 在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`...
`jni.h`提供了大量的函数原型,这些函数用于在Java虚拟机(JVM)和本地代码之间建立桥梁。例如,`FindClass`函数用于查找Java类,`GetMethodID`用于获取Java方法的ID,`CallObjectMethod`用于调用Java对象的方法等。...
由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码JNI是一种在Java虚拟机机制下的执行代码的标准机制。
通过这个结构体,本地方法可以访问和操作Java虚拟机(JVM)的各种服务。 5. **异常处理**:JNI提供了处理和抛出Java异常的机制,如`ExceptionOccurred`, `ExceptionDescribe`, `ExceptionClear`等。 `jni_md.h`...
JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法(非Java语言编写的方法),同时也允许本地代码调用Java对象的方法。JNI接口包括了Java到本地代码的调用以及本地代码到Java的回调。 要创建一个JNI应用,你...
`jni.h`文件包含了所有JNI函数的声明,这些函数允许Java虚拟机(JVM)与本地代码(即非Java语言编写的代码)进行通信。当你在Java程序中使用JNI时,你需要包含这个头文件来定义和实现本地方法,这些方法可以在Java类...
堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令地址,虚拟机栈保存每个方法的局部变量、操作数栈等,本地方法栈为JNI调用的本地方法服务。 3. 指令集:JVM使用一套基于栈的指令集,这些指令...
对象数组的处理涉及到对Java虚拟机(JVM)的内存管理和类型转换的理解。 1. **创建本地方法** 在Java类中,我们可以声明一个本地方法,使用`native`关键字,例如: ```java public class JniObjArrayExample { ...
JNI提供了一种桥梁,使得Java虚拟机(JVM)可以调用本地方法(即非Java语言编写的函数),同时也允许本地代码调用Java类的方法。这在需要利用C、C++或Delphi等语言高效性能或访问操作系统特定功能时特别有用。 ...
Android的JNI库提供了`CreateJavaVM`和`AttachCurrentThread`等API来初始化Java虚拟机(JVM)和关联当前线程到JVM。 4. **调用Java方法**:使用`JNIEnv`指针,你可以找到并调用Java对象的方法。注意,由于线程安全...
在JNI初始化阶段,Java虚拟机(JVM)会传递JNIEnv指针给本地方法。 3. **数据类型转换**:JNI提供了Java和本地类型之间的转换接口,如`jboolean`、`jint`等,以便在两种环境中交换数据。 4. **调用Java方法**:JNI...
5. **在.NET中初始化jni4net**:在C#代码中进行必要的初始化工作,如加载Java虚拟机(JVM)。 6. **调用接口**:现在,Java代码可以调用转换后的C#库中的函数,反之亦然。 jni4net在跨平台开发、利用现有.NET库增强...
首先,JNI提供了Java虚拟机(JVM)与本地代码之间的桥梁。通过JNI,Java程序可以声明native方法,这些方法的实现是在本地代码中,通常是C/C++。Java的`System.loadLibrary()`函数用于加载动态链接库,`native`关键字...
这意味着JVM的制造商可以独立于JNI的支持改进其虚拟机的其他部分,而不会影响到使用JNI的程序。这极大地增强了代码的可移植性和灵活性,程序员仅需编写一次本地应用程序或库,即可在所有支持JNI的JVM上运行,无需...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用C/C++库来提高性能,或者实现与硬件设备的直接通信时。本示例中,...
6. **线程管理**:JNI提供了与Java线程交互的功能,例如,`AttachCurrentThread`和`DetachCurrentThread`用于将本地线程附加到JVM或从中分离。 7. **字符串和字符数组**:JNI提供了处理Java字符串和字符数组的方法...