Java 基础:认识&理解关键字 native 实战篇

Writer:BYSocket(泥沙砖瓦浆木匠)

微博:BYSocket

豆瓣:BYSocket

泥瓦匠初次遇见 navicat 是在 java.lang.Object 源码中的一个hashCode方法:

?


1

public
native int hashCode();

为什么有个navicat呢?这是我所要学习的地方。所以今天泥瓦匠想要总结下navicat。

一、认识 native 即 JNI,Java Native Interface

凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。

二、用 Java 调用 C 的“Hello,JNI”

我们需要按照下班方便的步骤进行:

1、创建一个Java类,里面包含着一个 native 的方法和加载库的方法 loadLibrary。HelloNative.java 代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public
class HelloNative

{

    static

    {

        System.loadLibrary("HelloNative");

    }

    

    public
static native void sayHello();

    

    @SuppressWarnings("static-access")

    public
static void main(String[] args)

    {

        new
HelloNative().sayHello();

    }

}

首先泥瓦匠让大家注意的是native方法,那个加载库的到后面也起作用。native 关键字告诉编译器(其实是JVM)调用的是该方法在外部定义,这里指的是C。如果大家直接运行这个代码,  JVM会告之:“A Java Exception has occurred.”控制台输出如下:

?


1

2

3

4

5

Exception
in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

    at
java.lang.ClassLoader.loadLibrary(Unknown Source)

    at
java.lang.Runtime.loadLibrary0(Unknown Source)

    at
java.lang.System.loadLibrary(Unknown Source)

    at
HelloNative.<
clinit>(HelloNative.java:5)

这是程序使用它的时候,虚拟机说不知道如何找到sayHello。下面既可以手动写,自然泥瓦匠是用

2、运行javah,得到包含该方法的C声明头文件.h

泥瓦匠将HelloNative.java ,简单地 javac javah,如图

就得到了下面的 HelloNative.h文件 :

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

#include
<
jni.h>

/*
Header for class HelloNative */

#ifndef
_Included_HelloNative

#define
_Included_HelloNative

#ifdef
__cplusplus

extern
"C" {

#endif

/*

 *
Class:     HelloNative

 *
Method:    sayHello

 *
Signature: ()V

 */

JNIEXPORT
void JNICALL Java_HelloNative_sayHello

  (JNIEnv
*, jclass);

#ifdef
__cplusplus

}

#endif

#endif

jni.h 这个文件,在/%JAVA_HOME%include

3、根据头文件,写C实现本地方法。

这里我们简单地实现这个sayHello方法如下:

?


1

2

3

4

5

6

7

#include
"HelloNative.h"

#include
<
stdio.h>

JNIEXPORT
void JNICALL Java_HelloNative_sayHello

{

    printf("Hello,JNI");   

}

4、生成dll共享库,然后Java程序load库,调用即可。

在Windows上,MinGW GCC 运行如下

?


1

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

-m64表示生成dll库是64位的。然后运行 HelloNative:

?


1

java
HelloNative

终于成功地可以看到控制台打印如下:

?


1

Hello,JNI

三、JNI 调用 C 流程图

Writer:BYSocket(泥沙砖瓦浆木匠)

微博:BYSocket

豆瓣:BYSocket

时间: 2024-08-12 01:21:14

Java 基础:认识&理解关键字 native 实战篇的相关文章

Java 基础:认识&理解关键字 native 实战篇

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 泥瓦匠初次遇见 navicat 是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个navicat呢?这是我所要学习的地方.所以今天泥瓦匠想要总结下navicat. 一.认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这

Java基础语法(一)---关键字、常量、变量、运算符

Java基础语法(一)---关键字.常量.变量.运算符一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型: byte(1字节,最大值127) short(2字节,最大值为2^15-1) int(4字节,最大值为2^31-1) long(8字节,最大值为2^63-1) 浮点类型: float (单精度实数在内存中占32bit 有效数字为6~7位) double(双精度实数占内存单元为64bit 有效数字为15~1

Java基础之理解Annotation(与@有关,即是注释)

Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中.

java基础之final关键字

与final关键字相关的笔试题面试题也是一道必考题.而且对于final的实际应用非常广泛,在代码设计的时候,如果对此不够足够掌握,可能就会很难排查与此相关的异常. final的理论知识如下: final类型的成员变量初始化值: 1.声明时候直接赋值 2.构造方法中赋值,如果一个类中有多个构造方法,就要保证在每个构造方法中都要完成对final类型变量的初始化工作 3.静态final成员变量必须在声明时赋值,且不能在构造方法中赋值 4.final成员变量指的是引用不能改变,即该变量的引用不能在指向其

黑马程序员——Java基础语法(一) --- 关键字、标识符、注释、常量和变量、运算符

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 本篇博文主要总结java的基础语法,主要的内容包括:关键字.标识符.注释.常量和变量.运算符几部分. 一.关键字 关键字是被Java语言赋予了特殊含义的单词.关键字中所有的字母都是小写. java中的关键字主要包括如下几部分: 1.用于定

《Java架构筑基》从Java基础讲起——关键字汇总

1. 常见的关键字 如果还有没有写上的,麻烦小伙伴告知一声-- 用于定义数据类型的关键字 class interface byte short int long float double char boolean void 用于定义数据类型值的关键字 true false null 用于定义流程控制的关键字 if else switch case default while do for break continue return 用于定义访问权限修饰符的关键字 private protecte

【Java基础】final关键字总结

Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例.final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的. final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如

Java基础之static关键字的用法

Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.        静态(static)可以是: 变量(也称为类变量) 方法(也称为类方法) 代码块 嵌套类         修饰变量 被static修饰的变量称作静态变量或类变量:没有被static修饰的变量,称为实例变量.静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在类加载的过程中完成静态变量的内存分配(存储在"方法区

03 java 基础:注释 关键字 标识符 JShell

Java 10 中已有 Jshell 工具,方便用户在其中直接输入相关 java 代码. 注释:java 中分为单行注释 //   多行注释 /*   */   文档注释 /**  */ 关键字:在 java 中预先定义好的,有意义的标识符.java 关键字对编译器有着重要作用,用来表示一种数类型,亦或表示程序结构.关键字不能用作变量名.方法名.类名.包名和参数. JDK 后续增加了 assert .enum 关键字. 保留字:在 java 中保留的关键字,以后可能会用到.( goto  con