本文转载自: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 通讯的原理,以便我们在开发过程当中遇到问题时,能够快速定位到问题。

最新文章

  1. 为川师大女生支招 15年如何还200W
  2. selenium2.0关于python的常用函数(一)
  3. Android IPC机制之AIDL
  4. Java 时间和字符换的处理
  5. UML从需求到实现----包图
  6. CentOS下搭建使用gitlab 和tortoiseGit使用
  7. 卸载安装失败的sqlserver2008 R2
  8. 关于EJB 时间注解与oracle数据库时间格式
  9. 第一篇:NSTread线程的创建
  10. SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
  11. DOMContentLoaded
  12. SVN仓库迁移到Git遇到的两个问题和解决办法
  13. FFmpeg源代码简单分析:结构体成员管理系统-AVOption
  14. Windows2008+MyEclipse10+Android开发环境搭配
  15. 利用tcp三次握手,使用awl伪装MAC地址进行多线程SYN洪水攻击
  16. linux SSH免密码登录远程服务器
  17. 音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解
  18. glfw3native.h and glfw3.h
  19. Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序
  20. Linux vi 文本代码时显示行号或不显示行号

热门文章

  1. glOrtho、glFrustum && glPerspective
  2. java进阶书籍推荐
  3. 解决【必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1】的方法
  4. Servlet加载器的实验
  5. PostgreSQL Partitions
  6. VS的基本学习
  7. C#面向对象的方法写数组的功能
  8. Java的正则表达式
  9. Linux内核之旅 链表实现
  10. Fresco源码解析 - 创建一个ImagePipeline(一)