Go语言将支持Android

JNI简介

JNI (Java Native
Interface),Java的本地接口

      JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供
更高效,更灵活的拓展。应用场景包括:对运行效率敏感的算法实现、跨平台应用移植、调用系统的底层驱动、调用硬件等。尽管Java一贯以其良好的跨平台性
而著称,但真正的跨平台之王,应该是C/C++,因为当前世上90%的系统都是基于C/C++编写的。Java的跨平台,是以牺牲效率换来对多种平台的兼容性,因而JNI可以说是Java短板的补充!举一例子说明,当前流行的移动操作系统Android,一直被说系统操作的流畅性不如IOS,原因在于
Android的App是基于Java开发的,IOS的是基于Object-C开发的,区别在于同样的操作,在IOS上一条指令完成,在Android上
则需要多条指令才能完成!于是在Android
JellyBean版本中,Google为其引入ProjectButter(黄油计划),在应用层大量使用了本地库,并优化了系统的架构,以提升
Android系统整体的操作反应!

总之,JNI是一门技术,是Java Code和C/C++ Code联系的桥梁!

先回顾一下android的系统架构图:

澳门新葡萄京官网注册 1

为什么使用JNI

1、扩展JVM功能,访问驱动,操作硬件 (物联网、智能家居、车载电脑)

2、效率上c/c++语言效率更高 数学运算,实时渲染的游戏上,音 视频处理

澳门新葡萄京官网注册,3、 java反编译比c语言容易, 通过JNI增强代码安全性(加密算法放到C实现)

4、代码移植,复用已经存在的c代码(opencv,ffmpeg…)

怎么用JNI

1.C/C++语言

2.掌握java jni流程

3.NDK (native develop kits )

 

概述

NDK简介

1.NDK是一系列工具的集合

      
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2.NDK提供了一份稳定、功能有限的API头文件声明

      
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

澳门新葡萄京官网注册 2

获取更多C语言与算法的相关知识,关注公众号:“csuanfa”

澳门新葡萄京官网注册 3

1、Android
NDK

我们建议将Go语言引入Android平台,重点是用Go语言编写游戏程序,API将在Android
NDK中定义。

 一、NDK产生的背景

背景

  Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。

Android平台被设定为一个多应用操作系统,一个相对于传统UNIX系统来说更依赖于网络库和服务的操作系统,这意味着我们将为Go运行时开放更多的API。

  不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android SDK文档里,找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问Framework
API,Debug难度更大等。开发者需要自行斟酌使用。

将Golang带入Android平台是一件非常糟糕的事情,因为Android本身是Java构建的并且拥有巨量的API,任何试图将这些API用Go替代的结果将会导致一个非常糟糕的结果。无论是手工建立包装类还是自动建立都会导致程序运行非常缓慢。

  于是NDK就应运而生了。NDK全称是Native Development Kit。

然而如果使用基于C的API,通过AndroidNDK来编写一些游戏类程序可能会带来意想不到的收获。

  NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。

提议

 

在Golang
1.4周期中,Android平台的编译将纳入Go的源,并且包含Android支持的cgo(由Elias
Naur贡献)。Dalvik-loadable .so外部连接文件的支持也会由Android NDK提供。

二、为什么使用NDK

在发布上我们仍然提供交叉平台编译,并且支持在Linux主机上adb工具在Android设备上测试程序。

  1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

我们将会提供一个名叫go.mobile的子版本,包含:

  2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

1、通过Android NDK对OpenGL,OpenSL和OpenMAX的支持。

  3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

2、一个Java->Go的工具,支持通过Java调用Go的Package,所以许多游戏的菜单UI可以通过标准SDK构建。(有可能会支持通过其他语言调用Go,比如Objective-C。)

  4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

3、集成AndroidStudio

 

新特性将会在Go1.4稳定版中提供。

三、NDK简介

原文:

       1.NDK是一系列工具的集合

作者:David Crawshaw,谷歌Go工程师

      
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

翻译:冷絮

NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

(文/cnbeta)    

NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

      
2.NDK提供了一份稳定、功能有限的API头文件声明

      
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

 

四、NDK开发环境的搭建

1.下载安装Android NDK

 地址:

 

2、Android JNI

 native    国的;土著的;天然的;与生俱来的;天赋的

 Native
App 本地应用 ; 原生应用 ; 客户端应用 ; 原生应用程式

 

一:基本概念

JNI :
Java Native Interface
(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

       
 JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java
代码能够与用其它编程语言(如 C、C++
和汇编语言)编写的应用程序和库进行交互操作。

 

二:Android JNI
一般用途为:

1、主要是一些算法,因为c/c++比Java效率高,所以应用运行起来速度比较快,特别是一些游戏中的算法。
2、为了保密,都知道apk都可以被反编译,就算有代码混淆,也只是难看懂,并不是完全看不懂,但用jni编译成.so就不同了,所以可以达到商业机密不泄露的目的。
3、一个平台(C++代码)迁移到Android平台,底层逻辑是相同的,这样就可以通过移植,利用JNI调用底层C++代码,避免相同逻辑的代码重复去写,不过这个过程一定要注意底层对象的释放问题。

 

 3、NDK 与 JNI
的关系

 

JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。

JNI
是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。

 

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。