JNI开发入门
NDK开发入门
- JNI&NDK联系和区别
JNI是什么:- JNI是Java调用C++的规范,该规范为Java本身自带的,非Android创建。Java的JNI标准跟Android的存在不同,Android的JNI是谷歌的团队重写的,Android的更简单。
- JNI全称Java Native Interface,即Java本地接口,JNI是Java调用Native语言的一种特性.
- JNI使得Java与C/C++机型交互,即C++可以调Java,Java也可以调C++。
- JNI基于JVM,因此,可以将我们编写的JNI代码运行在任何实现JNI规范的JVM上。
- JNI代码被编写为汇编或C/C++,组装成动态库,这也是允许非静态绑定用法的前提。
NDK是什么
- NDK全称Native Develop Kit,以下引用官方的话:
Android NDK是一套允许您使用原生代码语言(例如C和C++)实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码块。
我们可以简单的理解为NDK就是一套工具集。帮助我们实现使用C/C++来实现某些应用的功能。
为什么需要JNI
- 调用一些优秀的C/C++的库
- JNI设计之初就保证了二进制的兼容性,C/C++直接运行在CPU上,不走JVM,所以效率比较高
- 保证性能
为什么需要NDK
- 在平台间移植应用
- 重复使用现有库
- 提升计算密集型情况下的性能
- 使用第三方库
- 不依赖Dalvik虚拟机
- 代码保护,C/C++反编译难度大。
C++对方法名重载——name mangling
名字修饰,又译作名字粉碎、名字重整,译自英文name mangling或name decoration,是现代计算机程序设计语言的编译器用于解决由于程序实体的名字必须唯一而导致的问题的一种技术。
它提供了在函数、结构体、类或其它的数据类型的名字中编码附加信息一种方法,用于从编译器中向链接器传递更多语义信息。
该需求产生于程序设计语言允许不同的条目使用相同的标识符,包括它们占据不同的名字空间(典型的名字空间是由一个模块、一个类或显式的namespace指示来定义的)或者有不同的签名(例如函数重载)。
任何由编译器产生的目标代码通常与另一部分的目标代码(产生于同一款或不同款的编译器)通过链接器把它们链接起来。链接器需要一大堆每个程序实体信息。例如正确链接一个函数需要它的名字、参数个数和它们的类型,等等。
如何解决name mangling
这里我们直接引用肉丝姐的星球里的内容
反射
这里的反射跟Java的反射是一样的。在运行状态下,对于任意类都可以知道它的属性和方法。