参考资料: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. python使用requests发送application/json报文数据

    def client_post_jsondata_requests(request_url,requestJSONdata): #功能说明:发送json请求报文到指定的地址并获取请求响应报文 #输入参 ...

  2. 新唐MCU常用的工具软件

    ICP   在电路编程  需要NULINK ISP   在系统编程,可通过串口或USB PINVIEW 可以显示管脚目前的状态.提供keil下或者单独运行两种模式.Keil下进入debug模式后,点击 ...

  3. AbstractQueuedSynchronizer-AQS

    AbstractQueuedSynchronizer,这个类是整个java.util.concurrent的核心之一. CountDownLatch 能够使一个或多个线程等待其他线程完成各自的工作后再 ...

  4. J - Printer Queue 优先队列与队列

    来源poj3125 The only printer in the computer science students' union is experiencing an extremely heav ...

  5. poj3087 Shuffle'm Up(模拟)

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10766   Accepted: 4976 Des ...

  6. poj2251_kuagnbin带你飞专题一

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32684   Accepted: 12529 ...

  7. linux应用以及常用命令

    各目录作用"/" :Linux文件系统的入口.也是最高一级的目录."/bin":基本系统所需要的命令,功能和"/usr/bin"类似,这个目 ...

  8. ubuntu下搭建LAMP环境

    本文参考:http://www.linuxdiyf.com/linux/21265.html 请支持原创. 步骤一:安装apache root@mrwang:~$ sudo apt install a ...

  9. myBatis框架_关于怎么获得多表查询的总记录数

    <!-- 查找总记录数 --> <select id="billCount" resultType="int"> select coun ...

  10. 创建一个抽象的员工类, 抽象开发累继承员工类,JavaEE ,和安卓继承开发类在测试类中进行测试

    /* 1 定义一个员工类  所有的子类都抽取(抽象类)  Employee            属性:姓名  工号(生成get  set  )       方法:工作  抽象     2 定义一个研 ...