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实现。
- JNI的基本介绍
- jni基本介绍
- Android NDK探究奥秘二:Jni的基本介绍。
- jni介绍
- JNI介绍
- JNI介绍
- JNI介绍
- JNI介绍
- JNI介绍
- JNI介绍
- JNI介绍
- JNI介绍
- Android NDK环境搭建及JNI开发java和C的相互调用的基本介绍
- JNI 基本使用方法
- JNI基本数据类型转换
- JNI基本数据类型对照
- jni 基本操作
- JNI的基本使用方法
- ServletConfig对象
- spring +hibernate对数据库配置信息加解密(DBCP)
- 从服务器下载&&OTA升级&&JSON文件解析
- 脚本语言学习
- android design
- jni基本介绍
- Net::POP3, login(), list(), get()
- EntityFramework DB操作帮助类
- Android学习系列(14)--App列表之圆角ListView
- Python创建和连接SqLite数据库
- Java加密和解密
- Redis 集合(Set)
- java 获取域名
- C#做窗体应用程序时,对excel涉及的背景色设置,边框设置,数据如何导入等的实现