参考资料:http://www.ntu.edu.sg/home/ehchua/programming/java/javanativeinterface.html(很详细)

看jdk源代码时,经常会看到类似下面的代码:

private native int read0() throws IOException; 

该类接口需要由c/c++实现。言下之意,它的实现与特定操作系统密切相关。

1、尝试自己实现一个简单的native接口:

public class TestNativeMethod {

    public static native void sayHello();

    static {
System.loadLibrary("sayHello_impl");
} public static void main(String[] args) {
sayHello();
}
}

直接编译是ok的,不过没法正常运行:

mdzz@LAPTOP-QGECNCGO MINGW64 /d/lab2
$ javac TestNativeMethod.java mdzz@LAPTOP-QGECNCGO MINGW64 /d/lab2
$ java TestNativeMethod
java.lang.UnsatisfiedLinkError: no sayHello_impl 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 TestNativeMethod.<clinit>(TestNativeMethod.java:6)
Exception in thread "main"

2、通过javah -jni TestNativeMethod命令得到TestNativeMethod.h(c/c++版本的“接口”):

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

3、书写相应的C/C++实现sayHello_impl.cpp

#include "TestNativeMethod.h"
#include <stdio.h> JNIEXPORT void JNICALL Java_TestNativeMethod_sayHello(JNIEnv *, jclass) {
printf("Hello, this is a native method.\n");
}

4、这个时候编译.cpp文件是100%报错的,你需要找到本地jdk文件夹内的两个.h文件:jni.h以及jni_md.h然后添加过去。。。。。。。然后设法将jni_md.h、sayHello_impl.cpp、TestNativeMethod.h、jni.h弄成一个sayHello_impl.ddl文件。

PS. 本人没弄成功,好不容易弄出ddl,运行程序时却报了32bit的ddl和64bit平台不兼容,更新mingw64老半天进度条又没动静,so。。。。。。。。。

5、最后再次运行TestNativeMethod就行了。所以native接口的实现是可以通过动态更改ddl而修改的。

Java笔记 #05# Java Native Interface的更多相关文章

  1. 转 Java笔记:Java内存模型

    Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...

  2. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  3. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...

  4. Java笔记:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  5. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  6. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

  7. effective java笔记之java服务提供者框架

    博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...

  8. 疯狂java笔记(七) - Java集合之Map

    Map是以键值对(key-value)的形式来存储数据的.而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可 ...

  9. java笔记 chapter1 java是什么,能干什么,有什么,特点,开发环境

    一,java是什么 二,java能干什么 三,java有什么 四,java的特点 五,java的三大特性:虚拟机,垃圾回收和代码安全 六,构建JSE开发环境:下载安装jdk和配置环境变量 七,编写并运 ...

随机推荐

  1. Oracle误删除数据的恢复方法(转)

    来源:原创网站北京北亚数据恢复中心,转载须注明出处. 学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些 ...

  2. xgboost原理

    出处http://blog.csdn.net/a819825294 1.序 距离上一次编辑将近10个月,幸得爱可可老师(微博)推荐,访问量陡增.最近毕业论文与xgboost相关,于是重新写一下这篇文章 ...

  3. [原]Django-issue(1)---postgresql数据库连接密码错误

    环境: Django==1.9.13 psycopg2==2.7.5 Python 3.6.5 postgresql 1.18.1 配置django的时候出现问题 检查setting,问题点:由于安装 ...

  4. Golang, 以 9 个简短代码片段,弄懂 defer 的使用特点

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  5. TypeSrcript如何引入第三方库 如果加d.ts以及async await如何使用 demo,只有代码,文字后续补充

    https://files.cnblogs.com/files/cappuccino/laya2.rar

  6. ArcGIS map preview in Power BI service

    登录PowerBI网站:www.powerBI.com 点[设置],如下图:   找到[适用PowerBI的ArcGIS地图(预览)] 点击[应用]即可. 打开PowerBI DestTop客户端,找 ...

  7. 我的WafBypass之道(Misc篇)

    先知技术社区独家发表本文,如需要转载,请先联系先知技术社区授权:未经授权请勿转载.先知技术社区投稿邮箱:Aliyun_xianzhi#service.alibaba.com: Author:Tr3je ...

  8. c++试题2

    一.写出下列程序的运行结果(40 分) 1.for(i=1;i<5;i++); cout << “OK” << endl; 程序执行后的输出结果是:  OK    ___ ...

  9. 个人小爱好:Operating System: three easy pieces—第6章第3小节问题2#进程间的切换

    问题2#:进程间的切换 直接执行的下一个问题是如何实现进程的切换.进程的切换按理说是挺简单的,对吧?不就是决定哪一个进程应该停止,哪一进程应该开始而已,才多大点事情啊?但,事实上这还真的有点棘手:尤其 ...

  10. 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...