JNI 概述【转】
本文转载自:http://wiki.jikexueyuan.com/project/jni-ndk-developer-guide/overview.html
相信很多做过 Java 或 Android 开发的朋友经常会接触到 JNI 方面的技术,由其做过 Android 的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,然后打包成.so动态库文件,并提供 Java 接口供应用层调用,这么做的目的主要就是为了提供应用的安全性,防止被反编译后被不法分子分析应用的逻辑。当然打包成.so也不能说完全安全了,只是相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,没那么容易被破解。比如百度开放平台提供的定位服务、搜索服务、LBS 服务、推送服务的Android SDK,除了Java接口的jar包之外,还有一个.so文件,这个.so就是实现了Java层定义的native接口的动态库。
以前公司有一个 JavaWeb 的项目,其中有一个用户注册的模块,需要验证用户的手机号(流程大家都懂的),由于这个项目的用户量不大,没用采用运营商的短信网关接口,直接采购了一台 16 口的短信猫设备和 SIM 卡来解决这个事情。由于短信猫设备只提供了 C 的接口,而 Java 是不能直接与 C 语言进行交互的,所以 JNI 就派上用场了,先在 Java 层定义好发送短信、接收短信、短信发送队列等相关 native 方法,然后用 javah 命令将定义 Java native 接口的 class 字节码文件生成.h头文件(这个后面会讲到),最后用设备场商提供的 C 接口来实现 java 的 native 方法,完了之后编译成.dll或.so动态库,提供给 Java 程序使用即可。
JNI 在 Cocos2d-x 游戏引擎中也经常用到,该引擎是用纯 C++ 开发的,而且是跨平台的,依托 C++ 的跨平台特性,只需用 C++ 编写一次逻辑,就可以将游戏打包发布到不同的平台(IOS、Android、WinPhone、黑莓、Linux、Windows),打包发布的细节就不在这里讨论了。如果游戏要发布到 Android 平台,开发过程当中,少不了 C++ 层和 Java 层进行交互,比如游戏当中要打开一个网页、播放一段视频或打开一个新的窗口等,这些在 C++ 层实现是非常麻烦的,如果用 Android 应用层提供的 API 就变得相当容易。所以这时就不得不写 JNI 来完成这些功能的需求。当然这些常用的 JNI 操作,Cocos2d-x 引擎进行了封装,相关的接口定义在 JniHelper.cpp这个类中,可以拿来直接使用。(后面会有例子详细介绍)
虽然现在的物联网和智能家居行业还处于萌芽状态,但随着这个时代在技术的创新与不断改进的发展下,想象 5 年后,物联网和智能家居行业真正成熟起来,由于 Android 系统的开源,自然会被各大硬件场商所采用,相当于这几年 Android 智能手机的市场一样,仍然可能会处于移动智能终端的霸主地位。你可能会问,但这和 JNI 和有什么关系呢?当各种设备接入互联网的同时,自然少不了人机交互的应用程序,当应用程序需要调用硬件特定的功能时,此时只能通过 C 或 C++ 封装对应功能的 JNI 接口来供上层应用使用。比如要用手机中的 app 控制家里的电灯、窗帘、冰箱、空调等一切智能的电子设备时,自然少不了应用要和底层硬件进行通讯,至于各种智能设备的运行控制,自然是由厂商来实现,他们只需提供操作设备相关功能的接口即可。虽然厂商会封装好 JNI 接口,但我们也要了解下 JNI 与 Java 通讯的原理,以便我们在开发过程当中遇到问题时,能够快速定位到问题。
JNI 概述【转】的更多相关文章
- JNI概述
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++). JNI 让你在利用强大 Java 平台的同时,使你仍然可以用 ...
- 深入理解JNI
深入理解JNI 最近在学习android底层的一些东西,看了一些大神的博客,整体上有了一点把握,也产生了很多疑惑,于是再次把邓大神的深入系列翻出来仔细看看,下面主要是一些阅读笔记. JNI概述 JNI ...
- Android JNI 学习(一):JNI 简介
JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...
- Android深入理解JNI(一)JNI原理与静态、动态注册
前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...
- 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制
第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...
- JNI基础
1.JNI概述 JNI 是 Java Native Interface 的缩写,中文译为“Java 本地调用”.通俗的说JNI是一种技术,通过这种技术我们可以做到以下两点: 1)Java 程序中的函 ...
- JNI原理与静态、动态注册
前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...
- Java安全之JNI绕过RASP
Java安全之JNI绕过RASP 0x00 前言 前面一直想看该JNI的相关内容,但是发现JNI的资料还是偏少.后面发现JNI在安全中应用非常的微妙,有意思. 0x01 JNI概述 JNI的全称叫做( ...
- 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析
作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...
随机推荐
- c#中匿名函数lamb表达式
c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...
- myscroll
<!DOCTYPE html> <head><meta http-equiv="Content-Type" content="text/ht ...
- Web:AJAX的网络请求
要访问的json文件内容如下图: 1.通过XMLHttpRequest方式发送请求 (1)前提创建XMLHttpRequest对象: //发送请求 var request; if (window.XM ...
- 禁用ipv6
禁用ipv6 1.在/etc/sysctl.conf 添加一行:net.ipv6.conf.all.disable_ipv6=1 2.在/etc/sysconfig/network 添加一行:NETW ...
- 中国电信某站点JBOSS任意文件上传漏洞
1.目标站点 http://125.69.112.239/login.jsp 2.简单测试 发现是jboss,HEAD请求头绕过失败,猜测弱口令失败,发现没有删除 http://125.69.112. ...
- C# Excel写入
基本思路,就是using Microsoft.Office.Interop.Excel;然后启动excel来处理 创建excel文件,代码如下: if (File.Exists(path)) { re ...
- Android --Activity与Fragment通讯
参考博客:详解Fragment跟Activity之间的通信 Activity中方法 private OnSearchListener mSearchListener; /** *定义一个借口 **/ ...
- 注意SQLServer2012中带参数的XP_ReadErrorLog
--15:26 2014-6-10数据库错误日志通知其中有一部分是检测ERRORLOG中若有用户登录失败信息时,会记录到Errorlog表,并邮件提醒.当时直接从同事那拿过来的脚本(08),按理说版本 ...
- XCODE中的蓝色文件夹与黄色文件夹
XCODE中的蓝色文件夹与黄色文件夹 黄色文件夹比较常见 - group , 在XCODE中以文件夹的形式存在,有层次感,但是实际文件在工程下是散乱的,没有层级结构.是XCODE中虚拟目录. 蓝色文件 ...
- mysql management note
related url : http://willvvv.iteye.com/blog/1563345 http://lxneng.iteye.com/blog/451985 这篇文章对vari ...