jni基本介绍

来源:互联网 发布:mac ruby安装 编辑:程序博客网 时间:2024/06/04 01:28

摘自:http://blog.chinaunix.net/uid-23023613-id-2559882.html

1.本地代码访问java代码。在被调用的C/C++函数中也可以反过来访问java程序中的类。

java通过jni机制调用C/C++写的native程序。C/C++开发的native程序需要遵循一定的jni规范。当java进入jni调用,除了函数本身的参数,会多出两个参数:JNIEnv指针和jobject指针。JNIEnv指针是JVM创建的,用于native的C/C++方法操纵java执行栈中的数据,比如java class ,java method等。

2.jni对JNIEnv的使用,提供了两种语法:c语法和c++语法(注:由于c语言并不支持对象的概念,所以c语法中需要把env作为一个参数传入,类似c++的隐式参数this指针):

c语法:

jsize len = (*env)->GetArrayLength(env,array);
c++语法:

jsize len =env->GetArrayLength(array);

另外JNIEnv有几个设计的原则:

第一、JNIEnv指针被设计成了Thread Local Storage(TLS)变量。也就是说每一个Thread,JNIEnv变量都有独立的copy。这样做的原因主要是考虑到:由于jvm要运行在多个平台,jni内部实现很多要依赖TLS,为了减少对TLS的依赖,所有TLS based数据都会存放于JNIEnv中。这样相当于只依赖一个TLS based的变量JNIEnv。由于JNIEnv指针是TLS的,所以你不能把Thread#1使用的JNIEnv传给Thread#2使用。

第二、JNIEnv中定义了一组函数指针,C/C++ native程序是通过这些函数指针操纵java数据。这样设计的好处是:你的C/C++程序不需要依赖任何函数库,或者DLL。由于JVM可能由不同的厂商实现,不同的厂商有自己不同的JNI实现,如果要求这些厂商暴露约定好的一些头文件和库,这不是灵活的设计。

而且使用函数指针表的另外一个好处是:JVM可以根据启动参数动态替换JNI实现。比如:类似c库,JNI实现为了性能起见,并没有对调用者传入的参数进行检查。但是在调试阶段,也许这种检查是必要的,帮助你尽早发现bug。例如如果你使用IBM JDK,你可以指定JVM蚕食-Xcheck:jni,告诉JVM使用带检查的JNI实现。

0 0
原创粉丝点击