首页 > 其他 > 详细

JNI学习笔记

时间:2014-06-24 18:08:35      阅读:275      评论:0      收藏:0      [点我收藏+]

JNI是什么-》一套c和java的互掉规则

 

为什么使用JNI

1.很多敏感效率的代码已经用C实现了

2. JNI双向,java调用c,c调用java

 

Java集成本地代码问题

1.代码移植,针对其他的平台需要重新编译库,.dll,.so

2.编码复杂了,需要处理掌握C和c++

 

1.JNI处理异常,不同于Java中的try...catch。在JNI中,发生异常,不会改变代码执行轨迹,所以,当返回NULL,要及时返回,或马上处理异常。

2.Java层的field和method,不管它是Public,还是package,private和protected,从JNI都可以访问到,Java面向语言的封装性不见了。

3.调用Java需要获取field与method IDs,需要做基于名称和签名的符号表查询,此过程可以被优化。思路:只在第一次使用ID时查询,然后缓存改值,有两个缓存时机:首次使用和初始化类时。

4.Java层对象作为opaque references传递到JNI层,是因为不希望JNI用户了解JNI内部数据结构.

5. signature:"(ILjava/lang/String;[I)J"

签名是一种用参数个数和类型区分同名方法的手段,即解决方法重载问题。

6. JNI支持三种类型的opaque reference: local references,global references和weak global references,local 和Global引用有不同的生命周期。Local Ref在nativemethod 执行完毕后被JavaVm自动释放,而Global需要手动释放。

  6.1大部分JNI函数都会创建LocalRef,如NewObject创建一个实例,并返回一个指向该实例。LocalRef只在本线程的native method中有效.一旦native method 返回,localRef将被释放。不要缓存一个LocalRef,并企图在下次进入该JNI方法时使用

 

7.Android 调用JNI流程

  1.编写XXX.java,里面包含System.loadLibrary()和Nativemethod的声明。

 2.javah XXX.java生成 .h文件

 3.编写.cpp实现.h中声明的方法

 4.将.cpp编译成.so

 

8. .so只会在运行时加载,不参与编译。


JNI学习笔记,布布扣,bubuko.com

JNI学习笔记

原文:http://blog.csdn.net/longwuxu/article/details/33730965

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!