`
zcz123
  • 浏览: 157153 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类

java中native的用法

 
阅读更多

前言:

在查看 Thread.java 文件时,发现有一个 方法比较特殊
private native void start0();

概念:

native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

native用法:

1.编写带有native声明的方法的Java类(java文件)
2.使用javac命令编译编写的Java类(class文件)
3.使用javah -jni ****来生成后缀名为.h的头文件(.h的文件)
4.使用其他语言(C、C++)实现本地方法
5.将本地方法编写的文件生成动态链接库(dll文件)

例子:

1.java文件

    class HelloWorld{

        public native void hello(String name);

        static{
            System.loadLibrary("hello");
        }

        public static void main(String[] args){
            new HelloWorld().hello("jni");
        }

    }

2.javac命令编译

    javac HelloWorld.java

3.生成.h文件 (注意 javah HelloWorld 后边不跟.class)

    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:    hello
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_hello
      (JNIEnv *, jobject, jstring);

    #ifdef __cplusplus
    }
    #endif
    #endif

4.实现本地方法

    #include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>
    JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj, jstring name){
        
        const char *str; 
        str = (*env)->GetStringUTFChars(env, name, NULL); 
        if (str == NULL) { 
            return; 
        } 
        
        printf("Hello World! %s \n", str );
        return;
    }

5.生成动态链接库(二选一)

    cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll

    gcc -m64  -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.8.0_131\include" -I"C:\Program Files\Java\jdk1.8.0_131\include\win32" -shared -o hello.dll hello.c

注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

JNI 调用 C 流程图



 

资料参考:

https://www.cnblogs.com/haitaofeiyang/p/7698121.html

https://www.cnblogs.com/b3051/p/7484501.html

https://www.ibm.com/developerworks/cn/java/jnimthds

  • 大小: 48.7 KB
分享到:
评论

相关推荐

    Java中native方法学习

    5. **加载动态链接库**:在Java代码中使用`System.loadLibrary`方法加载编译后的动态链接库,使Java虚拟机能够访问到其中定义的native方法。 ### 使用native方法的目的 使用Java中的native方法主要有以下目的: 1...

    java的native关键字学习

    7. **异常处理**:在本地方法中,如果发生错误,需要通过`JNIEnv`指针抛出Java异常,这样Java代码可以捕获并处理这些异常。 8. **线程安全**:JNI编程需要注意线程安全问题,因为Java多线程环境下,多个线程可能...

    JNI(Java Native Interface)中文手册

    ### JNI(Java Native Interface)中文手册关键知识点解析 #### 一、前言及背景 JNI(Java Native Interface)是Sun Microsystems公司定义的一套标准接口,用于实现Java代码与本地代码(通常是C或C++)之间的交互。...

    关于java中的native方法

    Java中的Native方法是Java语言与本地(Native)代码交互的一种机制,主要涉及到Java的JNI(Java Native ...通过阅读`jni.pdf`文档和研究`jni examples.zip`中的示例代码,可以更深入地理解JNI的工作原理和使用方法。

    Java中native方法和JNI基础.docx

    本文将详细介绍Java中native方法的定义、JNI的基本使用流程,并结合示例代码进行说明。 #### 二、Java Native Interface (JNI) ##### 1. 概念介绍 Java Native Interface (JNI) 是Java平台的一部分,它允许Java...

    java native 中的C代码

    2. **编写JNI头文件**:在Java中,我们需要声明一个native方法,例如`public native void accessRegistry()`. 然后使用`javah`工具(或现代IDE中的相应功能)生成对应的C/C++头文件,如`HelloNative.h`,其中包含了...

    微信支付源码 java网页微信支付 java网页Native微信支付源码

    在这个Java网页Native微信支付源码中,我们可以深入理解微信支付的API调用、二维码生成以及支付回调处理等关键流程。 1. **微信支付接口调用**: - 微信支付提供了多种接口供开发者使用,如统一下单接口(Unified ...

    Java Native Interface Programmers Guide and Specification(Exp)

    - **Java源代码**:包含Java类,声明了native方法,并使用`System.loadLibrary()`加载本地库。 学习JNI,开发者需要理解以下关键概念: - **JNIEnv指针**:这是JNI的核心,它是一个指向一组函数指针的指针,这些...

    使用native方法实现加密解密

    最后,要在Java代码中调用这些native方法,你需要使用`javah`工具(或者Android Studio的Generate JNI Header功能)生成对应的JNI头文件,然后在C/C++源文件中实现这些函数。例如: ```c++ #include #include ...

    java native 接口开发流程

    使用`javah`命令,根据带有`native`方法的Java类生成对应的JNI头文件。例如,对于上面的`HelloWorld`类,执行`javah HelloWorld`会生成一个`HelloWorld.h`头文件。 4. **编写C/C++代码**: 根据生成的头文件,...

    Java Native Interface Specification R1.1

    JDK 1.0版本中引入了Native Method Interface(NMI),这是JNI的前身,主要目的是让Java能够调用非Java语言编写的本地方法。随后,Java Runtime Interface(JRI)和Raw Native Interface被提出,进一步发展了这一...

    Java Native Access JNA-4.5.0

    Java Native Access (JNA) 是一个Java平台的开源库,它允许Java程序无需编写C语言的JNI(Java Native Interface)代码就能直接调用本机库函数。JNA 提供了一种简单的方式来映射Java方法到本地函数,使得开发者能够...

    Professional Java Native Interfaces with SWTJFace

    4. **源码分析**:压缩包中的“javaui”可能包含了书中示例代码的源文件,这些代码可以用于学习如何使用SWT和JFace构建实际的Java应用程序。通过阅读和运行这些源码,开发者能够深入理解这两个库的工作原理以及如何...

    react native java sdk 安装包

    在React Native的环境中,Java SDK是必不可少的,因为Android平台的原生组件和模块的构建离不开它。 本文将详细介绍如何在Windows操作系统上安装"react native java sdk 安装包",以及如何确保环境配置成功。 首先...

    java-native学习(包含代码)

    在`main`方法中,创建`TestNative`的实例并调用本地方法,将结果输出到控制台。 通过以上步骤,我们就完成了Java和C++之间的交互,利用JNI实现了Java代码调用C++的本地方法。这种方式在需要高效计算、调用操作系统...

    JNA Java Native Access

    Java Native Access(JNA)是Java平台上的一个开源框架,它允许Java代码直接调用操作系统原生函数,而无需编写传统的Java本地接口(JNI)代码。JNA提供了一种更简单、更直观的方式来与C库和其他本地代码进行交互,极...

    Java Native Interface简介

    Java Native Interface(JNI)是Java平台的一个重要组成部分,它的主要功能是允许Java代码与本地(非Java)代码进行交互,通常这些本地代码是由C、C++或其他编程语言编写的。JNI提供了一种桥梁,使得Java应用程序...

    Java Native Interface 6.0 Specification (JNI) 原创PDF书签

    1. Java中的本地方法需要以native关键字声明,并且需要有一个与之对应的本地方法实现,该实现是用C/C++或其他支持的本地语言编写的。 2. 本地代码在被Java虚拟机(JVM)加载时需要遵守特定的命名约定,这样才能通过...

    详解Java中native关键字

    1. 定义 native 方法:在Java类中,使用`native`关键字声明一个方法,但不提供具体的实现。例如: ```java public class MyClass { public native void myNativeMethod(); } ``` 2. 编写本地代码:使用JNI编写C或...

Global site tag (gtag.js) - Google Analytics