参考资料: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. IP地址在mysql的存储(IP地址和int的转换)

    PHP echo ip2long('192.168.1.38'); 输出:3232235814 MYSQL SELECT INET_ATON('192.168.1.38'); 输出:323223581 ...

  2. 浏览器调起Hbuilder的APP

           最近用Hbuilder来开发APP,测试各种功能,其中,最近测试到,要用这个浏览器调起APP的功能,我看官网有教程,但是有些可能刚工作没多久,所以,有些地方看不大明白,官方也没细说,所以 ...

  3. cs231n(三) 误差反向传播

    摘要 本节将对反向传播进行直观的理解.反向传播是利用链式法则递归计算表达式的梯度的方法.理解反向传播过程及其精妙之处,对于理解.实现.设计和调试神经网络非常关键.反向求导的核心问题是:给定函数 $f( ...

  4. R - Dividing 多重背包

    来源poj1059 Marsha and Bill own a collection of marbles. They want to split the collection among thems ...

  5. gym 101657 D

    理论1A.  //没删debug的文件读入.. 傻逼题. 先求出来每条边两侧的三角形,然后枚举边,根据叉积判断三角形位置,建图,拓扑排序. #include <bits/stdc++.h> ...

  6. js 日期排序(sort)

    按创建时间日期排序 例如 eg 1.升序 2.降序 返回的结果: 注: 支持IE和Chrome其他的浏览器可自行测试

  7. css 调转180度:transform: rotate(180deg);

    css 调转180度:transform: rotate(180deg);

  8. 最难解的耦合 — James

    最近好久没写博客,因为换工作原因,从传统企业转行到互联网行业,这次换工作成本很大! 新公司,纯互联网广告公司,BI驱动,出来几日感觉成长空间很大,下面来些干货. 什么是程序.软件 程序 = 数据结构 ...

  9. mac下supervisor安装及简单配置

    supervisor是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(守护进程).可以用他来管理自己的“服务程序”. 安装 首先安装Python,Mac系统好像自带. 执 ...

  10. Java新帮派——数组

    一.什么是数组: 数组是一个变量,存储相同数据类型的一组数据 声明一个变量就是在内存空间划出一块合适的空间 声明一个数组就是在内存空间划出一串连续的空间 二.数组基本要素: 标识符:数组的名称,用于区 ...