native 关键字和JNI 接口介绍

native关键字和JNI的概念

查看java Object类的源码,发现hashCode方法是这样实现的

public native int hashCode();

使用native关键字修饰了hashCode方法,那么native关键字到底有什么作用呢?

The native keyword is applied to a method to indicate that the method is implemented in native code using JNI (Java Native Interface).

stackoverflow 上给出了这样的回答

翻译一下,就是说 使用了native关键字的方法就说明这个方法是一个调用Java本地接口(Java Native Interface,即JNI)实现的方法。

那么问题来了,什么是JNI(Java本地接口呢)?

简单点说,就是用其他编程语言,主要是C或C++或汇编语言实现的接口。

通过JNI,Java可以调用一些由其他语言开发的功能,或者可以被其他的语言所调用,从而实现了Java和其他语言的双向连接。

一个简单的JNI接口示例

那么怎么实现一个简单的JNI接口呢?以用C语言实现JNI接口为例,具体步骤如下:

1 创建一个包含native接口的java类

public class HelloJNI {
   static {
      System.loadLibrary("hello"); // Load native library at runtime
                                   // hello.dll (Windows) or libhello.so (Unixes)
   }
 
   // Declare a native method sayHello() that receives nothing and returns void
   private native void sayHello();
 
   // Test Driver
   public static void main(String[] args) {
      new HelloJNI().sayHello();  // invoke the native method
   }
}

2 编译Java类并生成.h 文件
jdk 8 的编译命令

javac -h . HelloJNI.java

jdk8之前的编译命令,分为两步

javac HelloJNI.java
javah HelloJNI

生成的 HelloJNI.h 如下所示

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
 
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

3 创建C文件 HelloJNI.c

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"
 
// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

4 生成本地类库文件,以Ubuntu 64位的操作系统为例

先导入JAVA_HOME的环境变量

export JAVA_HOME=/your/java/installed/dir
echo $JAVA_HOME

编译生成类库文件

gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c

5 运行java程序

java -Djava.library.path=. HelloJNI

上面的例子来自这篇文章,里面还有C++的程序示例以及不同操作系统编译的命令,十分的详细。感兴趣的同学可以参考一下。

上面的例子亲测有效,需要注意的是编写第1步的java程序时,不要加上包名,如果加上包名还按后面的步骤执行的话,最后会报一个Error: Could not find or load main class HelloJNI 的错误。不加包名是可以的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,144评论 25 707
  • 似水流年,距踏入二外的校门之初已经有20个年头了。然而三年初中天真浪漫的学习生活时光却长久地种植在我心里,估计一生...
    Will爲阅读 302评论 0 0
  • 把自己想象成做不到的样子 于是 生活中再懦弱自卑的我 也将是个受万众瞩目的人 我的世界从此有光 那些阴暗的天气都会...
    坠落羽翼阅读 172评论 0 1
  • 0 序 四个半月后,虽然不愿意,不舍得,还是得背上行囊去上班,带着洗奶瓶和诸多道具,风里来雨里去。至今快两个月了。...
    幕芷阅读 453评论 1 1
  • 挤不进的圈子,不要硬挤, 难为了别人,作贱了自己; 跨不过的门坎,不要硬跨, 跨过了是门,跨不过就是坎。 做不来的...
    饥者求食阅读 622评论 1 13