`

23、jvm之JNI

    博客分类:
  • java
 
阅读更多

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工程目录下:


 传递参数需要了解数据类型在内存中的表示,后跟进

  • 大小: 7.3 KB
  • 大小: 12.1 KB
  • 大小: 5.9 KB
  • 大小: 7.9 KB
  • 大小: 11.7 KB
  • 大小: 5.8 KB
分享到:
评论

相关推荐

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    在IT领域,跨语言通信是常见的需求之一,而C++与Java之间的交互就涉及到了Java Native Interface (JNI)。本文将深入探讨如何使用C++创建Java虚拟机(JVM),并通过JNI来调用Java函数。这是一项技术性很强的任务,...

    Jvm.rar_jni_jni 线程_jvm

    在这个"Jvm.rar_jni_jni线程_jvm"的压缩包中,我们主要探讨的是JNI与Java线程的交互。 首先,JNI的核心是定义了一套接口,让Java代码可以创建本地方法(Native Method),这些方法可以在C/C++中实现。在"Jvm.cpp"这...

    JNI调试心得

    JNI 是一种标准的接口,用于 Java virtual machine(JVM)与 native 代码之间的交互。JNI 允许 Java 代码调用 native 代码,并且 native 代码也可以调用 Java 代码。JNI 的主要用途是: 1. 访问 native 资源,例如...

    DELPHI开发JNI必备 jni.pas

    `jni.pas`和`JNI_MD.INC`一起使用,可以帮助Delphi开发者构建能够在Java虚拟机(JVM)上运行的本地代码模块。 在Delphi中使用JNI,开发者可以实现以下功能: 1. **调用Java方法**:通过JNI,Delphi代码可以直接调用...

    Java_JNI_获得系统进程信息实例.doc

    ### Java与JNI结合获取系统进程信息的实现 #### 概述 在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`...

    JNI的两个头文件jni.h和jni_md.h

    `jni.h`提供了大量的函数原型,这些函数用于在Java虚拟机(JVM)和本地代码之间建立桥梁。例如,`FindClass`函数用于查找Java类,`GetMethodID`用于获取Java方法的ID,`CallObjectMethod`用于调用Java对象的方法等。...

    JNI使用规范详解.pdf

    由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码JNI是一种在Java虚拟机机制下的执行代码的标准机制。

    jni.h头文件

    通过这个结构体,本地方法可以访问和操作Java虚拟机(JVM)的各种服务。 5. **异常处理**:JNI提供了处理和抛出Java异常的机制,如`ExceptionOccurred`, `ExceptionDescribe`, `ExceptionClear`等。 `jni_md.h`...

    JNI实现示例DEMO

    JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法(非Java语言编写的方法),同时也允许本地代码调用Java对象的方法。JNI接口包括了Java到本地代码的调用以及本地代码到Java的回调。 要创建一个JNI应用,你...

    jni.h文件.7z

    `jni.h`文件包含了所有JNI函数的声明,这些函数允许Java虚拟机(JVM)与本地代码(即非Java语言编写的代码)进行通信。当你在Java程序中使用JNI时,你需要包含这个头文件来定义和实现本地方法,这些方法可以在Java类...

    jdk,jvm源码

    堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令地址,虚拟机栈保存每个方法的局部变量、操作数栈等,本地方法栈为JNI调用的本地方法服务。 3. 指令集:JVM使用一套基于栈的指令集,这些指令...

    jni传递对象数组

    对象数组的处理涉及到对Java虚拟机(JVM)的内存管理和类型转换的理解。 1. **创建本地方法** 在Java类中,我们可以声明一个本地方法,使用`native`关键字,例如: ```java public class JniObjArrayExample { ...

    用Delphi开发JNI应用

    JNI提供了一种桥梁,使得Java虚拟机(JVM)可以调用本地方法(即非Java语言编写的函数),同时也允许本地代码调用Java类的方法。这在需要利用C、C++或Delphi等语言高效性能或访问操作系统特定功能时特别有用。 ...

    jni中用多线程调用java代码

    Android的JNI库提供了`CreateJavaVM`和`AttachCurrentThread`等API来初始化Java虚拟机(JVM)和关联当前线程到JVM。 4. **调用Java方法**:使用`JNIEnv`指针,你可以找到并调用Java对象的方法。注意,由于线程安全...

    JNI CHM文档以及JNI编程规范

    在JNI初始化阶段,Java虚拟机(JVM)会传递JNIEnv指针给本地方法。 3. **数据类型转换**:JNI提供了Java和本地类型之间的转换接口,如`jboolean`、`jint`等,以便在两种环境中交换数据。 4. **调用Java方法**:JNI...

    jni4net-0.8.8.0.zip

    5. **在.NET中初始化jni4net**:在C#代码中进行必要的初始化工作,如加载Java虚拟机(JVM)。 6. **调用接口**:现在,Java代码可以调用转换后的C#库中的函数,反之亦然。 jni4net在跨平台开发、利用现有.NET库增强...

    JNI

    首先,JNI提供了Java虚拟机(JVM)与本地代码之间的桥梁。通过JNI,Java程序可以声明native方法,这些方法的实现是在本地代码中,通常是C/C++。Java的`System.loadLibrary()`函数用于加载动态链接库,`native`关键字...

    JNI完全手册

    这意味着JVM的制造商可以独立于JNI的支持改进其虚拟机的其他部分,而不会影响到使用JNI的程序。这极大地增强了代码的可移植性和灵活性,程序员仅需编写一次本地应用程序或库,即可在所有支持JNI的JVM上运行,无需...

    JNI实现回调及JNI开启线程

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用C/C++库来提高性能,或者实现与硬件设备的直接通信时。本示例中,...

    jni.h文件,完美适配ida软件,直接就可以使用。

    6. **线程管理**:JNI提供了与Java线程交互的功能,例如,`AttachCurrentThread`和`DetachCurrentThread`用于将本地线程附加到JVM或从中分离。 7. **字符串和字符数组**:JNI提供了处理Java字符串和字符数组的方法...

Global site tag (gtag.js) - Google Analytics