java中native的用法

 

前言:

在查看 Object.java 文件时,发现有一个 方法比较特殊(不认得,看不懂...)
  private static native void registerNatives();

概念:

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文件。

资料参考:

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

http://blog.csdn.net/funneies/article/details/8949660

java native 笔记的更多相关文章

  1. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  2. Java Native Interface 六JNI中的异常

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...

  3. Java Native Interface 五 JNI里的多线程与JNI方法的注册

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...

  4. Java Native Interface 四--JNI中引用类型

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

  7. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...

  8. Java Native Interface 编程系列一

    本文是<Java Native Interface Programmer's Guide and Specification>的读书笔记 Java Native Interface可以让编 ...

  9. Java系列笔记(4) - JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...

随机推荐

  1. vue-router同路由$router.push不跳转一个简单解决方案

    vue-router同路由$router.push不跳转一个简单解决方案 vue-router跳转一般是这么写: toCurrentPage: function(thisId){ this.$rout ...

  2. Linux内存管理(一)

    Linux内存管理之一:基本概念篇 物理地址.线性地址(虚拟地址)和逻辑地址:阐述段式管理和页式管理基本概念:Linux操作系统内存管理和虚拟内存概念:为内核开发做一个基础铺垫. 内存是linux内核 ...

  3. sap快捷登录

    利用程序SAPSHCUT.EXE    示例:sapshcut  -type=Transaction -system=IDS -client=800 -user=barry -pw=123456 -l ...

  4. spring cloud config svn仓库配置

    之前快速入门了一下spring cloud config 但是仓库用的别人博客上的git仓库,公司用的是svn项目管理中心,下面这个自己配置的时候出现的错误 You need to configure ...

  5. 微信小程序 遇到的问题(新)

    1.调用wx.chooseImage(),调用系统相册,此时相册中的动图被转化成静态图,上传后也是静态图. 2.刚进微信小程序,onShow在安卓机下会调用两遍,iPhone下正常

  6. iSlide——智能图表的用法

    iSlide中有一个“智能图表”功能,用于制作漂亮.明了的图表.单击“智能图表”,会弹出一个对话框.从中,可以选择权限.分类和数量级,也可以直接搜索. 实战: 我想做一个全班不同年级近视人数的统计报, ...

  7. AI 帮助涂鸦

    这个小工具挺有意思,可以在涂鸦的同时自动猜测你要画什么,并自动完成. https://quickdraw.withgoogle.com/

  8. awk shell

    作业一:整理博客,内容包含awk.变量.运算符.if多分支 awk   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...

  9. sciense

    I hate the word "networking." It must be one of the most overused words in the English lan ...

  10. MFC窗口风格 WS_style/WS_EX_style

    窗口风格(Window style) WS_BORDER   有边框窗口 WS_CAPTION   必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用.指示窗口包含标题要部分 ...