jni基本介绍

摘自: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值