一、JNI概述
JNI 是Java Native Interface的缩写,中文翻译为“Java本地调用”,JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。就是说,JNI是一种技术,通过这种技术可以做到两点:
1)Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
新建一个java文件,可以看出第二行有个native,说明这个函数是java和其他语言(c/c++)协作时用的,并用其他语言实现。在文件中有 System.loadLibrary,它是对本地方法的加载,原则上是在调用native函数前,任何时候,任何地方加载都可以,它的参数是动态库的名字。
然后需要用命令javac HelloWorld.java生成HelloWorld.class文件,
下一步是利用javah -jni -classpath . HelloWorld生成对应C/C++的HelloWorld.h文件,设置classpath的目的在于告诉java环境,在哪些目录下可以找到所要执行的java程序所需要的类或者包,此处不用声明.class文件名,在对应目录下编译器会自动找到。查看.h文件:
注释部分是对应文件的类、native方法和方法签名。方法的签名是由方法的参数和返回值类型共同构成的,如.h文件中,Signature:()V,其中()中代表的是方法参数,V代表的是方法无返回值。java程序中参数类型和Signature有不同的对应值,可网上查阅,此处不赘述。
此处对应java中方法的jni函数,JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject);这里的JNIEXPORT和JNICALL都是JNI关键字,表示此函数是要被JNI调用的。
JNIEnv是一个与线程相关的代表JNI环境的结构体&#
JNI 是Java Native Interface的缩写,中文翻译为“Java本地调用”,JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。就是说,JNI是一种技术,通过这种技术可以做到两点:
1)Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
2)Native程序中的函数可以调用Java层的函数,也就是说C/C++程序可以调用Java函数。
1、JNI本地调用:(以例子介绍)
java:(HelloWorld.java)
class HelloWorld {
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
新建一个java文件,可以看出第二行有个native,说明这个函数是java和其他语言(c/c++)协作时用的,并用其他语言实现。在文件中有 System.loadLibrary,它是对本地方法的加载,原则上是在调用native函数前,任何时候,任何地方加载都可以,它的参数是动态库的名字。
然后需要用命令javac HelloWorld.java生成HelloWorld.class文件,
下一步是利用javah -jni -classpath . HelloWorld生成对应C/C++的HelloWorld.h文件,设置classpath的目的在于告诉java环境,在哪些目录下可以找到所要执行的java程序所需要的类或者包,此处不用声明.class文件名,在对应目录下编译器会自动找到。查看.h文件:
*******
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
*******
注释部分是对应文件的类、native方法和方法签名。方法的签名是由方法的参数和返回值类型共同构成的,如.h文件中,Signature:()V,其中()中代表的是方法参数,V代表的是方法无返回值。java程序中参数类型和Signature有不同的对应值,可网上查阅,此处不赘述。
此处对应java中方法的jni函数,JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject);这里的JNIEXPORT和JNICALL都是JNI关键字,表示此函数是要被JNI调用的。
JNIEnv是一个与线程相关的代表JNI环境的结构体&#