`

java jni调用过程分析

    博客分类:
  • java
阅读更多

1.定义java类中的native方法,新建下面一个类

 

public class NativeDemo {

    public static native void say();  //static的native方法
    
    public native void sayHello();  //实例的native方法,两者的处理不一样
    
    public static int number = 10;
    
    int a = 2;
    
    public void callThis(){
        System.out.println("c++ call java method");
    }
    
    public static void main(String[] args) {
        System.loadLibrary("NativeJni");
//        NativeDemo.sayHello();
        new NativeDemo().sayHello();
        say();
    }
}

 

2.进入java命令行

   D:\project\workplatform.apps.demoLearnCenter\src\main\java>javah -help

用法:javah [选项] <类>

其中 [选项] 包括:

        -help                 输出此帮助消息并退出
        -classpath <路径>     用于装入类的路径
        -bootclasspath <路径> 用于装入引导类的路径
        -d <目录>             输出目录
        -o <文件>             输出文件(只能使用 -d 或 -o 中的一个)
        -jni                  生成 JNI样式的头文件(默认)
        -version              输出版本信息
        -verbose              启用详细输出
        -force                始终写入输出文件

使用全限定名称指定 <类>(例
如,java.lang.Object)。


D:\project\workplatform.apps.demoLearnCenter\src\main\java>javap -help
Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure

 

 


3.在vc++新建一个dll的控制台工程

 


 

4.在vc的工程里面导入刚才的那个NativeDemo.h的头文件,然后因为这个头文件需要引用jdk安装目录下的jni.h和jni_mt.h的两个头文件,从jdk的安装目录下的拷贝到工程里面

 


 

4.编写NativeDemo.h的头文件定义的两个类的实现(这里需要吧jni.h include的时候要改为“”,而不是<>,因为jni.h是在当前工程里面

  /* DO NOT EDIT THIS FILE - it is machine generated */

#include "jni.h"
/* Header for class NativeDemo */

#ifndef _Included_NativeDemo
#define _Included_NativeDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeDemo
 * Method:    say
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_NativeDemo_say
  (JNIEnv *, jclass);

/*
 * Class:     NativeDemo
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_NativeDemo_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

c++源文件

   #include "NativeDemo.h"

#include "jni.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_NativeDemo_say(JNIEnv * env, jclass jclazz)  //static的方法生成的两个参数是JNIEnv * env, jclass jclazz,第二个参数代表java的类的class实例
{
	jclass jclass_native = env->FindClass("NativeDemo"); //查找类的class对象,
	jfieldID jfield_numberId = env->GetStaticFieldID(jclass_native,"number", "I"); //获得jclazz类的静态字段number,第三个参数代表静态变量的签名,java每种类型对应到一个签名串
	jint jfield_number = env->GetStaticIntField(jclass_native, jfield_numberId);//获得jclazz类的静态变量的值
	cout << jfield_number << endl; //打印静态变量的值

}

JNIEXPORT void JNICALL Java_NativeDemo_sayHello(JNIEnv *env, jobject jobj)//实例方法生成的第二个参数是jobject,代表某一个实例
{
	jclass clazz = env->GetObjectClass(jobj); //获得实例jobj的class对象
	jfieldID jfield_numberId = env->GetFieldID(clazz,"a", "I"); //获得这个实例的a实例变量
	jint jfield_value = env->GetIntField(jobj,jfield_numberId);  //获得这个实例的a实例变量的值
	cout << jfield_value << endl;//打印这个实例的a实例变量的值
}

 

5.编译这个vc的工程,生成一个dll文件

 


 

6.在我的电脑属性里面设置环境变量path增加这个dll的目录,因为java需要从path变量找到这个dll的目录

7.打开eclipse,编写调用的main函数代码

  public class NativeDemo {

    public static native void say();  //static的native方法
    
    public native void sayHello();  //实例的native方法,两者的处理不一样
    
    public static int number = 10;
    
    int a = 2;
    
    public void callThis(){
        System.out.println("c++ call java method");
    }
    
    public static void main(String[] args) {
        System.loadLibrary("NativeJni");
//        NativeDemo.sayHello();
        new NativeDemo().sayHello();
        say();
    }
}

         执行这个main函数,结果如下

 


 

在java中需要使用System.loadLibrary("NativeJni");加载vc工程生成的dll文件,这里dll后缀不能加。

 


  • 大小: 142.7 KB
  • 大小: 131 KB
  • 大小: 36.4 KB
  • 大小: 164.2 KB
  • 大小: 100 KB
  • 大小: 57.3 KB
分享到:
评论

相关推荐

    Java JNI调用IC卡读卡器

    在Java中,JNI调用DLL的过程主要包括以下步骤: 1. 创建Java接口:首先,你需要在Java源文件中定义一个接口,这个接口会声明所有你需要调用的DLL函数。这些函数声明的签名必须与DLL中实际函数的参数和返回类型完全...

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

    本项目工程提供了完整的Java、C++和C#的示例,可以帮助开发者理解如何在实际项目中实现Java通过JNI调用C# DLL的过程,从而提升应用的性能或实现特定的功能。通过学习和实践这个工程,开发者可以进一步提升跨语言编程...

    JAVA JNI调用DLL完整步骤

    在某些场景下,比如调用操作系统特定的功能或者利用已有的C/C++库,我们需要使用JNI来实现Java与本地代码(如DLL动态链接库)的交互。本教程将详细介绍如何通过JNI在Java中调用DLL的完整步骤。 1. **创建Java类和...

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

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

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

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

    GMSSL的java调用(JNI库和调用实例).zip

    5. **Java端的JNI调用**:在Java代码中加载动态库,然后通过`System.loadLibrary()`方法调用相应的JNI函数。 在实际应用中,开发人员需要考虑兼容性问题,如不同操作系统下的动态库加载方式、32位与64位系统的差异...

    Java通过JNI调用DLL动态库

    Java通过JNI调用DLL动态库,亲测试编写

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

    Java JNI调用DLL方法

    在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...

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

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

    JAVA JNI C++调用示例

    在这个过程中,关键点包括正确地处理JNI数据类型,如 `jobject`、`JNIEnv *` 和 `jmethodID`,以及在C++中调用Java方法。JNI提供了一套API来实现这些功能,例如 `CallVoidMethod()`、`FindClass()` 和 `GetMethodID...

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

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

    Java jni调用c实例

    在这个"Java jni调用c实例"中,我们将深入探讨如何通过JNI在Java应用程序中调用C语言编写的函数。 首先,我们需要了解JNI的基本结构。一个典型的JNI程序包括Java源代码、C/C++源代码以及对应的头文件。Java源代码中...

    java jni 调用刷卡器

    - JNI调用这些API,可以控制刷卡器执行读卡、识别磁条或芯片卡等任务,获取到卡片的唯一标识或其他相关信息。 4. **HttpClient技术**: - Java的`HttpURLConnection`或第三方库如Apache HttpClient,用于发起HTTP...

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

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

    java运用jni调用dll实现屏蔽系统热键和任务栏

    Java使用JNI调用DLL来实现系统热键屏蔽与任务栏隐藏是一种跨平台编程技术的应用,主要涉及Java的本地接口(JNI)和Windows API。本文将深入解析这一技术的关键点,并提供相关的知识背景。 首先,JNI(Java Native ...

    android JNI C 调用Java

    Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码调用C/C++原生代码,同时也允许C/C++代码调用Java的方法。JNI在开发高性能、低级硬件交互、使用现有C库或者优化性能的关键部分时...

    java通过jni调用libcurl,curl java

    libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP 支持libcurl(允许你用不同...PHP自带curl扩展,但java没有curl扩展,这个工程的目的,就是将libcurl进行封装,以jni的方式进行调用

    java 的jni本地调用简单实例

    总结来说,这个实例展示了Java通过JNI调用C++本地方法的基本流程,包括Java端的声明、JNI头文件的生成、C++的实现、动态链接库的编译以及最终的调用。虽然这个实例没有涉及复杂的类型转换,但在实际应用中,根据数据...

Global site tag (gtag.js) - Google Analytics