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)一文中举例子说明了如何在 ...
随机推荐
- 【转】实现Sqlite datediff日期时间相减的方法
对sqlite既恨又爱,在小项目里,用sqlite开发起来非常方便,效率足够用.美中不足的是sqlite精简了些功能及相关函数.如存储过程,datediff,不支持并发写入及远程访问(或许有些高手说这 ...
- JavaScript 正则表达式RegExp 和字符串本身的正则表达式
JavaScript 正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模 ...
- PHP · MySQL函数
连接名=mysql_connect("主机","用户名","密码"); 连接名=mysql_qconnect("主机", ...
- jackson @ResponseBody 处理日期类型的字段
前言:以前只知道一种方式(@JsonFormat)来处理日期格式问题,今天才发现还有两种方式,并且可以全局设置格式,这里记录一下. 首先,pom.xml 中需要先引入如下 jackson 的依赖: & ...
- js 数组删除元素,并获得真实长度
前言:js数组删除一般采用数组的 splice 方法和 delete 方法,但是采用 delete 方法后直接数组.kength 来获取数组长度是获取不了真实长度的,下面详细讲解一下. 一.splic ...
- 为什么要用 C# 来作为您的首选编程语言
因为您可以用,并且也是您的最佳选择!之所以可用,是因为 C# 能够很好地在 Mac.Linux.Android 和 iOS 上运行(对了,还有 Windows):它可以在您最喜爱的编辑器上运行:它在一 ...
- LeetCode Tries Prefix Tree
class TrieNode { public: ; TrieNode* child[NR_FANOUT]; int count; // Initialize your data structure ...
- [翻译]Review——24 tips for React Native you probably want to know
Post author: Albert Gao Post link: http://www.albertgao.xyz/2018/05/30/24-tips-for-react-native-you- ...
- c#中表达式的返回值是啥?
今天在学javascript的时候发现它其中有一个语法是这样的(a="haha).length;这样也能够输出haha这个字符串的长度,然而我在使用c#的时候分行读取txt文本的时候也用这个 ...
- 163. [USACO Mat07] 牛语
☆ 输入文件:latin.in 输出文件:latin.out 简单对比 时间限制:1 s 内存限制:128 MB 译: zqzas 奶牛们听说猪发明了一种秘密语言,叫做"猪语 ...