JNI总结(一)
JNI 是 Java平台中的一个强大特性。应用程序能够通过
JNI把 C/C++代码集成进 Java程序中。通过
JNI。开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资。由于
JNI是 Java平台定义的规范接口。当程序猿向
Java代码集成本地库时。仅仅要在一个平台中攻克了语言互操作问题。就能够把该解决方式比較easy的移植到其它 Java平台中。
比方为 Dalvik加入了一个本地库,也能够把这个本地库非常easy的移植到
J2SE和 Apache Harmony中,由于在
Java与 C/C++互操作方面,大家都遵循一套 API接口,即
JNI。
Java 平台(Java Platform)的组成:Java
VM和 Java API. Java应用程序使用 Java语言开发,然后编译成与平台无关的字节码(.class文件)。
Java API由一组提前定义的类组成。不论什么组织实现的 Java平台都要支持:Java编程语言,虚拟机,和
API(Sun对 Java
语言、虚拟机和 API有明白规范)。
平台环境:操作系统,一组本机库,和
CPU指令集。本地应用程序,通常依赖于一个特定的平台环境,用
C、C++等语言开发。并被编译成平台相关的二进制指令,目标二进制代码在不同
OS 间一般不具有可移植性。Java平台(Java VM和
Java API)一般在某个平台下开发。
比方,Sun的
Java Runtime Environment(JRE)支持类 Unix和
Windows 平台. Java平台做的全部努力。都为了使程序更具可移植性。
当 Java
平台部署到本地系统中。有必要做到让 Java 程序与本地代码协同工作。部分是因为遗留代码(保护原有的投资)的问题(一些效率敏感的代码用 C 实现。但如今 JavaVM 的运行效率全然可信赖),project师们非常早就開始以 C/C++为基础构建 Java 应用,所以,C/C++代码将长时间的与 Java 应用共存。
JNI让你在利用强大 Java平台的同一时候,使你仍然能够用其它语言敲代码。
作为 JavaVM 的一部分,JNI 是一套双向的接口。同意 Java 与本地代码间的互操作。
作为双向接口。JNI 支持两种类型本地代码:本地库和本地应用。用本地代码实现
Java 中定义的 native method 接口,使 Java 调用本地代码通过 JNI 你能够把 Java VM 嵌到一个应用程序中,此时 Java 平台作为应用程序的增强,使其能够调用 Java 类库比方,在浏览器中执行 Applet, 当浏览器遇到"Applet"标签。浏览器就会把标签中的内容交给 Java VM 解释执行,这个实现,就是典型的把 JavaVM 嵌入 Browser 中。JNI 不仅仅是一套接口,还是一套使用规则。 Java 语言有"native"keyword,声明哪些方法是用本地代码实现的.
翻译的时候,对于"native method",依据上下文意思做了不同处理,当native method 指代 Java 中用"native"keyword修饰的那些方法时,不翻译;而当代码用C/C++实现的部分翻译成了本地代码。
上述,在应用中嵌入 Java VM的方法。是用最少的力量,为应用做最强扩展的不二选择,这时你的应用程序能够自由使用 Java API 的全部功能;大家有兴趣能够读一读浏览器是怎么扩展 Applet 的,或者读一读
Palm WebOS 的东西。
我们整个小组做了两个平台的扩展,设计、编码、測试和 debug 用了近一年半时间,代码量在 14000 行左右,做完扩展后,平台功能空前增强。我感觉做软件,难得不在编码。难在開始的设计和后期的測试、调试和优化,并终于商用。这就要求终于产品是一个强大而稳定的平台,达到此目标是个旷日持久的事. 看看 Java,Windows,Linux,Qt。WebKit 发展了多少年?向全部软件project师致敬!
请记住,当 Java程序集成了本地代码,它将丢掉 Java 的一些优点。
首先,脱离 Java后。可移植性问题你要自己解决,且需又一次在其它平台编译链接本地库。
第二,要小心处理 JNI编程中各方面问题和来自 C/C++语言本身的细节性问题,处理不当。应用将崩溃。
一般性原则:做好应用程序架构,使 native methods定义在尽可能少的几个类里。
学习 JNI编程是个漫长的实践过程,会碰到无数问题。
用 C/C++编程。常见问题有内存泄露,指针越界...,此外使用了 JNI,还要面对JavaVM的问题:
•在本地代码中 new一个 Java 对象后期望在本地代码中维护此对象的引用,怎样避免被 GC;
• Java 面向对象语言的封装性被破坏了,Java 类中不论什么方法和属性对 JNI 都是可见的。无论它是 public 的,还是 private/protected/package 的
• 对LocalRef/GlobalRef 管理不善。会引发 Table Overflow Exception,导致应用崩溃
•从 JNI调用 Java 的过程不是非常直观,往往几行 Java 代码能搞定的事情。用 JNI 实现却要几百行
当你准备在项目中使用 JNI之前。请先考虑一下是否有其它更合适的方案。上节有关 JNI缺点的介绍,应该引起你足够的重视。这里介绍几个不通过 JNI 与其它语言交互的技术:
IPC 或者通过TCP/IP 网络方案 ( Android ASE)
数据库方面。能够使用 JDBC
使用 Java的分布式对象技术:Java IDL API IPC 与 TCP/IP 是经常使用的基于协议的信息交换方案. 能够參考 Android 上的Binder 和ASE(Android Script Environment)。
一典型的解决方式是。Java程序与本地代码分别执行在不同的进程中. 採用进程分置最大的优点是:一个进程的崩溃,不会马上影响到还有一个进程。可是,把Java 代码与本地代码置于一个进程有时是必要的。例如以下
Java API 可能不支某些平台相关的功能。比方,应用程序运行中要使用 Java API 不支持的文件类型,而假设使用跨进程操作方式,即繁琐又低效避免进程间低效的数据拷贝操作多进程的派生:耗时、耗资源(内存)用本地代码或汇编代码重写Java 中低效方法
总之。假设 Java必须与驻留同进程的本地代码交互,请使用 JNI。写代码是技巧和艺术,看你想在设计上下多大功夫. 比方: Chrome。是多进程的典范。她的简洁、高效,令人叹服。关于 Java 应用程序怎样与本地代码互操作的问题,在 Java 平台早期就被提了出来.JDK1.0
包含了一套与本地代码交互的接口。当时很多 Java 方法和库都依赖本地方法实现(如 java.io, java.net)。可是,JDK release 1.0 有两个主要问题:Java 虚拟机规范没有定义对象布局。本地代码訪问对象的成员是通过訪问 C 结构的成员实现的本地代码能够得到对象在内存中的地址,所以。本地方法是 GC 相关的为解决上述问题对 JNI 做了又一次设计。让这套接口在全部平台都easy得到支持。
虚拟机实现者通过 JNI 支持大量的本地代码工具开发商不用处理不同种类的本地接口全部 JNI 开发人员面对的是操作
JavaVM 的规范 APIJNI 的首次支持是在 JDK release 1.1,但 1.1 内部 Java 与本地代码的交互仍然使用原始方式(JDK 1.0). 但这样的局面,没有持续非常久,在 Java 2 SDK release1.2 中 Java 层与本地代码的交互部分用 JNI 重写了。
作为 JavaVM规范的一部分,Java 层与本地代码的交互。都应通过 JNI实现
JNI总结(一)的更多相关文章
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- JNI 备注
本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- jni操作jobject
一. 注册JNI函数 1. 静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2. 动态注册 使用JNINativeMe ...
- JNI开发的常见错误
1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...
随机推荐
- 告诉你一个真实的OpenStack:都谁在用,用来干什么?
告诉你一个真实的OpenStack:都谁在用,用来干什么? OpenStack基金会近日发布的双年调查报告显示,开源云计算软件OpenStack正在进入主流企业市场,但该项目依然面临较难部署和管理的老 ...
- jquery 图片无缝切换
想要和园友分享一下学习jquery的经验.总结,更希望园友提出点建议. 第一次写,有不好的地方请多多见谅! 文笔有限,很多时候不知道怎么来描述,唉.硬伤啊!!那只好多做了,贴代码... ok,废话少说 ...
- 在Linux上运行C#
众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...
- UVa 1642 (综合) Magical GCD
题意: 给出一个数列,求一个连续的子序列,使得MGCD(i, j) = 该子序列的长度(j-i+1) × 子序列的gcd 最大,并输出这个最大值. 分析: 感觉可能要用优先队列,但貌似也用不上. 但 ...
- JSOI2007文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1613 Solved: 656[Submit][Statu ...
- 剑指Offer:二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h> int wrong_count_1_bits(int n) // 错误解法 ...
- 多线程程序设计学习(6)Producer-Consumer模式
Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...
- Entity Framework4.0 (七) EF4的存储过程
前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- android中常用的弹出提示框
转自:http://blog.csdn.net/centralperk/article/details/7493731 我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的 ...