JNI学习笔记
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学习笔记的更多相关文章
- JNI学习笔记_Java调用C —— 非Android中使用的方法
一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...
- JNI学习笔记_C调用Java
一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:http://blog.csdn.net/lhzjj/article/details/26470999步骤: a. 创建 ...
- JNI学习笔记_Java调用C —— Android中使用的方法
一.笔记 1.JNI(Java Native Interface),就是如何使用java去访问C/C++编写的那些库.若想深入了解JNI可以看官方文档jni.pdf.优秀博文:Android JNI知 ...
- JNI 学习笔记
JNI是Java Native Interface的缩写,JNI是一种机制,有了它就可以在java程序中调用其他native代码,或者使native代码调用java层的代码.也 就是说,有了JNI我们 ...
- JNI 学习笔记系列(一)
JNI全称是Java native interface,它是一个中间件,通过JNI可以使Java和C语言之间互相调用,在android开发中,像wifi热点的开启,像极品飞车中重力加速,碰撞效果的模拟 ...
- JNI 学习笔记系列(二)
c中没有Boolean类型的值,一般是使用1表示true,0表示false,c中也没有String类型的数据,c中的字符串要通过char数组来表示.c中没有byte类型,一般用char表示byte类型 ...
- android学习笔记----JNI中的c控制java
面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为: 1).将知识分解 ...
- android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)
简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)一文中举例子说明了如何在 ...
随机推荐
- 通向全栈之路——(4)nginx反向代理配置
1.安装nginx:sudo apt-get install nginx2.新建配置文件:cd /etc/nginx/conf.dsudo vi XXX-cn-8080.conf内容如下:upstre ...
- 量子猴排(Quantum Bogo sort)
排序原理 原理很简单,如果数组不是有序的,就洗一次牌,直至数组有序为止 时间复杂度 最佳情况O(n),平均情况O(n×n!) 代码如下: import java.util.Random; public ...
- [选译]MySQL5.7以上Zip版官方安装文档
前言 在windows上安装Zip版MySQL(选译) 学习mysql的朋友们会发现5.7+版本的mysql变得比以前难安装了许多(当然我们可以选择installer版本,但是这样总感觉对学习mysq ...
- Hibernate的一对多实例
一对多在现实生活中很常见,今天做了个Hibernate的一对多的实例,也是个入门过程,写下来跟大家分享. 最重要的是xml配置文件,之前因为把英文"(引号)错误的复制成中文的“”(引号),导 ...
- js程序中美元符号$是什么(转)
$符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的1.首先可以用来表示变量, 比如变量 var s='asdsd'或var $s='asdasd ...
- webstorm修改文件,webpack-dev-server及roadhog不会自动编译刷新
转自:http://www.cnblogs.com/ssrsblogs/p/6155747.html 重装了 webstorm ,从10升级到了2016 一升不要紧,打开老项目,开启webpakc-d ...
- Hbase-indexer常用命令
1. 启动hbase-indexer服务 nohup ./hbase-indexer server -z s1:,s2:,s3:,s4:,s5: > /work/hbase-indexer.lo ...
- Spring Boot—19Cache
pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- linux 目录、文件名、logout、exit、shutdown、reboot、init 0、init 6、runlevel
/dev 设备目录/boot 系统启动目录/etc 配置文件保存目录/media./mnt./misc 挂载目录,实际可以自己随便定义一个目录作为挂载目录/opt 安装第三方软件位置,但现在 ...
- react实例:理解dva构建项目的原理
请点击相应的步骤查看详情 我们首先搭建一个 dva Demo 项目(请参考react快速构建一个应用项目),然后逐步完成以下内容: 结构划分 设计 Model 组件设计方法 组件设计实践 添加 Re ...