本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobject,jclass,jstring,jarray)作为不透明的引用.本地代码不直接检查不透明指针的内容,而是通过使用JNI方法来得到一个指向数据结构的指针的不透明引用.也就是说JNI操作的内容都是引用,因此我们只需要知道在JNI中有哪些引用.JNI支持三种不透明的引用:本地引用.全局引用,弱全局引用. 本地引用…
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如int,float等)和引用类型(如class,instance,arrays),JNI编程里对这两种的类型的处理方法也是不一样的. JNI定义了与Java的基本类型和引用类型相对应的C/C++类型: Java类型 本地类型(JNI中使用) boolean jboolean int jint float jf…
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, 在本地方法里捕捉并抛出异常 下面的例子说明怎样声明一个可能抛出异常的本地方法: class CatchThrow { //声明一个本地方法,并可能会抛出不合法参数异常 private native void doit() throws IllegalArgumentException; private vo…
Java Native Interface Specification(JNI) 使用场景: 需要的功能,标准的java不能提供 有了一个用其他的语言写好的工具包,希望用java去访问它 当需要高性能的功能时(时间是最主要的因素) 通过本地方法(通过JNI),可以完成: 创建,检查,和更新java 对象(包括数组和Strings) 调用java方法 捕捉和抛出异常 加载类和获取类信息 运行时类型检查…
1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/intro.html#java_native_interface_overview This chapter introduces the Java Native Interface (JNI). The JNI is a native progra…
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的代码时,需要知道下面几个约束: 一个JNIEnv指针只在与它关联的线程里有效,也就是说,在线程间传递JNIEnv指针和在多线程环境里通过缓存来使用它是不允许和不安全的.JVM在同一个线程里多次调用同一个本地方法时传递的是同一个JNIEnv指针,但在不同的线程里调用同一个本地方法时传递的是不同的JNIEnv指针…
JNI能让Java代码在Java虚拟机里调用其他编程语言(例如C.C++)写的应用或库,且不会影响任何Java虚拟机的实现. 什么时候用JNI? 1.应用程序所需的平台相关功能,标准的Java类库不支持时. 2.已经有一个用其他语言写的库,想要复用时. 3.想使用一些低级别的语言(例如汇编)实现部分关键代码时. JNI问题 1.对开发者的要求更高. 2.丧失可移植性. 例子(C语言,on Mac) 1.添加声明为native的方法. package nativetest; public clas…
案例二:传递参数给C代码,并从其获取结果 注:这里传递的参数是基本类型的参数,在C代码中有直接的映射类型. 此案例所有生成的所有文件如下: (1)编写案例二的Java代码,如下: 这里我们定义了一个native方法,此方法用于计算两数平均值.将两个Java int类型的值传递给C代码,使其计算并返回double值.然后输出到标准IO流 注:这里加载动态链接库的方式,改为了loadLibrary,只需提供库名即可,但是接下来在运行的时候,需要指定java.library.path,使其指向库所在的…
JNI是Java Native Interface的 缩写.从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了. 使用java与本地已编译的代码交互,通常会丧失平台可移植性.但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件.操作系统进行交互,或者为了…
https://docs.oracle.com/en/java/javase/12/docs/specs/jni/index.html Google翻译 第1章:简介 本章介绍Java Native Interface(JNI). JNI是本机编程接口. 它允许在Java虚拟机(VM)内运行的Java代码与用其他编程语言(如C,C ++和汇编语言)编写的应用程序和库进行互操作. JNI最重要的好处是它对底层Java VM的实现没有任何限制. 因此,Java VM供应商可以添加对JNI的支持,而不…
案例四:回调实例方法与静态方法 描述:此案例将通过Java调用的C语言代码回调Java方法. 要想调用实例对象的方法,需要进行以下步骤: 1. 通过对象实例,获取到对象类的引用  => GetObjectClass() 2. 通过类引用,获取到方法ID  => GetMethodID() 需要提供方法名,和方法签名.也就是需要这两个信息来标识确定一个方法. 方法签名格式:(参数列表)返回值类型. 例如: ()V或(Ljava/lang/String;)V等等.这里的所说的类型表示与案例三相同…
一.JNI(Java Native Interface)        1.什么是JNI:               JNI(Java Native Interface):java本地开发接口               JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++)               外部的c/c++代码也可以调用java代码        2.为什么使用JNI:               效率上 C/C++是本地语言,比java更高效      …
案例三:C代码访问Java对象的实例变量   获取对象的实例变量的步骤: 1. 通过GetObjectClass()方法获得此对象的类引用 2. 通过类引用的GetFieldID()方法获得实例变量的Field ID. 你需要提供 变量名,字段类型描述符 对于Java 类, 字段描述符格式为 "L<类全称>;" 类全称中,点"."用 "/"代替.例如,String 的描述符为"Ljava/lang/String;"…
前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互. 你可能至今还没听说过这个技术,但是如果你是一个源码爱好者,或者有翻阅过JDK的一些源码,那你一定有接触过native方法.你是否因为查阅源码直到native方法戛然而止,但又由于它的空方法体,而对底层原理不知所以? 本文就带让你了解JNI.并通过一些案例来自己实现JNI的交互. 什么是JNI? JNI 全…
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低. 然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能. 接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率.…
1.  Introduction At times, it is necessary to use native (non-Java) codes (e.g., C/C++) to overcome the memory management and performance constraints in Java. Java supports native codes via the Java Native Interface (JNI). JNI is difficult, as it inv…
转自:http://blog.csdn.net/xw13106209/article/details/6989415 1.参考文献: http://blog.csdn.net/youjianbo_han_87/article/details/2586375 http://blog.csdn.net/yangjiali014/article/details/1633017 http://blog.chinaunix.net/space.php?uid=7437948&do=blog&id=2…
native方法定义: 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C.这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数. VM怎样使Native Method跑起来:    我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次.在这个被…
前言 今天在读java.lang.Object 源码中时发现一个 一个hashCode方法: public native int hashCode() 原因Java很好,使用的人很多.应用极广,但是Java不是完美的.Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问.JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和…
本文是<Java Native Interface Programmer's Guide and Specification>的读书笔记 Java Native Interface可以让编程人员在Java里调用其他语言编写的方法,来弥补Java运行效率低下的缺点: jni可以用来做什么?: 在Java应用中使用本地编程语言如c/c++编写的代码: 将Java虚拟机融入到由C/c++编写的的应用中: 实现一个Java虚拟机: 从技术层面理解语言的互操作性,特别是垃圾收集机制和多线程实现机制: j…
概述 Java Native Interface译为Java原生接口,简称JNI.Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供了JNI实现对于底层访问.说得通俗点,通过JNI可以调用其他程序(本地语言),这个语言要可以和操作系统直接交互(C和C++) Native native修饰的函数简单的说就是调用一个非Java代码写的接口,并且native这个关键字可以和其他标识符号连用,但唯独abstract除外(无实现体). N…
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html 1. Introduction Java Native Interface OverviewBackground JDK 1.0 Native Method InterfaceJava Runtime InterfaceRaw Native Interface and Java/COM Interface ObjectivesJava Native…
在上一篇文章中介绍了JNI.以及java调用JNI.这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你能够创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数. JNI通过ID识别域和方法.一个域或方法的ID是不论什么处理域和方法的函数的必须參数. 下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数.每一个函数接受(作为參数)域或方法的类,它们的名称,符号…
首先记录一个问题,关于如何用javah生成头文件. 为什么要生成头文件?在含有 static{ System.loadLibrary("hellojni"); } 这样代码的类下面定义方法,比如 static public native String PrintHello(); 那么再用javah生成头文件,h文件就会更新,含有这个方法的定义. 如何生成h文件? windows下:javah -classpath bin/classes -d jni com.ggndktest1.Jn…
一.JNI字段描述符 "[I" ---  int[] "[[[D" --- double[][][] 如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“:”结束.比如"Ljava/lang/String;"就是表示类型String: 二.JNI方法描述符 括号里放置参数,在括号后面放置返回类型,当一个函数不需要返回参数类型时,就使用”V”来表示.格式如下: (参数描述符)返回类型 比如 "()Ljava/lang/…
参看: http://blog.csdn.net/xw13106209/article/details/6989415…
参考资料: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 { p…
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html http://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html…
一.先说一下大致的意思: jdk提供的类库源代码中有一些方法没有实现,这些方法前有native关键字,如object类中的 : native Object clone() throws CloneNotSupportedException; public final native Class getClass(); 使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用. 这些函数的实现体在DLL中,JDK的源代码中并不包含,…
源文链接: http://mysuperbaby.iteye.com/blog/915425 一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个Java的方法:该方法的实现由非Java语言实现,比如C或C++. 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平台上的JNI机制使用包括Java代码中调用Native模块以及Native代码中调用Java模块. http://www.ophonesdn.com/artic…