JNI

android JNI开发(1)--搭建cygwin环境

守給你的承諾、 提交于 2019-11-27 04:44:07
1.什么是cygwin? 百度百科: http://baike.baidu.com/view/3968.htm 2.什么是android ndk? Android NDK 即Native Development Kit,因此又被称为“NDK”。 在此之前,Android平台的第三方应用程序均是依靠基于Java的Dalvik特制虚拟机进行开发的。原生SDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语言编写程序,并在程序封包文件(.apks)中直接嵌入原生库文件。 不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。 NDK包括了: 从C / C++生成原生代码库所需要的工具和build files。 将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。 支持所有未来Android平台的一些列原生系统头文件和库 3.为什么要使用cygwin? cygwin是一个模拟unix环境,可以对C或C+

Android平台上的JNI技术介绍

て烟熏妆下的殇ゞ 提交于 2019-11-27 01:09:30
NDK简介 Android是由Google领导开发的操作系统,Android依靠其开放性,迅速普及,成为目前最流行的智能手机操作系统。 图0-1 Android系统架构图 图0-1是Android系统架构图。大多数程序位于最上层的Java Application层。Android通过把系统划分为几个层次从而使得开发者可以使用平台无关的Java语言进行Android应用开发,不必关心程序实际的硬件环境。 Google不仅为开发者提供了SDK开发套件,为了能让开发者使用C/C++编写的本地化的共享库,利用编译后的共享库更高效的完成计算密集型的操作来提高应用的性能,或者移植重用已有的C/C++组件,提高开发效率,Android 1.5之后,又推出了NDK(Native Development Kit)。有了NDK,开发者能够在Android平台上使用JNI(Java Native Interface)技术,实现应用程序中调用本地二进制共享库。 由于Android系统不同于以往的JNI使用环境而是在嵌入式硬件环境下,Android NDK提供了一套交叉编译工具链,和构建程序的工具方便开发者在桌面环境下编译目标平台的二进制共享库。 目前NDK提供了对ARMv5TE,ARMv7-A,x86和MIPS指令集平台的支持,同时在本地接口的支持上,目前以下本地接口支持 libc libm libz

Android NDK开发简介

帅比萌擦擦* 提交于 2019-11-27 01:09:17
最近由于项目的需要,使用到了Android的NDK技术,对项目核心算法跨平台的移植。简答而言,就是使用C对原来的算法进行了改进,并集成到原来的app项目里。 从前的项目一直没有使用NDK进行开发的机会,因而一直仰慕那些技术大牛们关于NDK以及C/C++开发而写的文章,觉得很深奥,因而一直蠢蠢欲动。 其实NDK的开发并不复杂,就入门而言甚至可以说是easy job,觉得它难是难于C/C++代码的编写与调试。这个是我最近从事NDK开发的一点感受! 首先,我们要弄懂几个概念,何为NDK,它和SDK以及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开发的

Android深入浅出之Zygote[1]

怎甘沉沦 提交于 2019-11-26 18:41:57
Android 深入浅出之 Zygote 一 目的 zygote ,是 Android 搞出来的一个东西。网上讲这个的也非常多。第一次看到这个名字我就挺郁闷,想干嘛这是? Linux 下名字都取得挺通俗易懂,深得人心。 zygote ?不就想模仿 Linux 下的 fork 吗?个人觉得 Google 取名字挺怪,包括 Google 本身。 不管怎样, Zygote 依然是 Android 系统的核心, zygote 是受精卵的意思,可以认为是 Android framework 大家族的祖先!我们本节的目的是描述下 zygote 的来龙去脉,顺便揭露下它的短处,以后大家可以对症下药,变异一个更加优良的品种。 二 Zygote zygote 本身是一个应用层的程序,和驱动,内核模块之类的没点关系。这下大家放心点了吧 ?zygote 的启动由 linux 的祖先 init 启动。这个在 init 分析中提过。这里就不说了。 zygote , ps 中看到的进程名叫 zygote ,其最初的名字是 app_process ,通过直接调用 pctrl 把名字给改成了 ”zygote” 。不过不影响我们分析。 zygote 的代码在 framework/base/cmds/app_process/App_main.cpp 中。我们一步步来看。 既然是应用程序,直接看 main 咯。 [--

Zygote启动及其作用

ぐ巨炮叔叔 提交于 2019-11-26 18:41:39
目录 1、Zygote简介 2、Zygote进程如何启动   2.1 init.zygote64_32.rc文件   2.2 查看ps信息   2.3 启动 3、Zygote作用   3.1 启动system_server   3.2 查看与验证Zygote启动systemserver   3.3 Zygote启动其他子进程 4、总结 1、Zygote简介 1.1 系统启动流程 从按下电源到看到launcher,手机的启动是一个非常复杂的过程。 bootloader是手机上电之后第一个运行的程序,其作用是硬件的初始化,其作用类似于PC机的bios。 bootloader完成其工作后,将 Linux kernel镜像拷贝到内存中。完成剩余的与硬件平台相关的初始化工作,比如文件系统,驱动模块。最后启动第一个用户进程-init 进程并等待用户进程的执行。 用户空间的第一个进程init 1.2 zygote理解 在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的。由于Zygote进程在Android系统中有着如此重要的地位,本文将详细分析它的启动过程。---老罗 android系统中创建java世界的盘古 创建新进程的女娲。 ---邓凡平 2、Zygote进程如何启动 2.1 init.zygote64_32

头部姿态估计 - Android

荒凉一梦 提交于 2019-11-26 17:39:29
概括 通过Dlib获得当前人脸的特征点,然后通过旋转平移标准模型的特征点进行拟合,计算标准模型求得的特征点与Dlib获得的特征点之间的差,使用Ceres不断迭代优化,最终得到最佳的旋转和平移参数。 Android版本在原理上同C++版本: 头部姿态估计 - OpenCV/Dlib/Ceres 。 主要介绍在移植过程中遇到的问题。 使用环境 系统环境:Ubuntu 18.04 Java环境:JRE 1.8.0 使用语言:C++(clang), Java 编译工具:Android Studio 3.4.1 CMake 3.10.2 LLDB NDK 20.0 上述工具在Android Studio中SDK的管理工具里下载即可。 第三方工具 Dlib :用于获得人脸特征点 Ceres :用于进行非线性优化 源代码 https://github.com/Great-Keith/head-pose-estimation/tree/master/android/landmark-fitting 准备工作 第三方库的Android接口 Dlib 使用的GitHub上提供的现成接口:https://github.com/tzutalin/dlib-android 该项目还提供了具体的app样例:https://github.com/tzutalin/dlib-android-app/

Android NDK开发之数组类型的操作

泪湿孤枕 提交于 2019-11-26 17:36:58
Jni 可以通过JNIEnv提供的方法,对传过来的Java数组进行相应的操作。它提供了两种函数:一种是操作Java的简单型数组的,另一种是操作对象类型数组的。 操作Java的简单型数组 因为速度的原因,简单类型的Java数组,会作为指向本地类型的指针暴露给本地代码调用。因此,它们 能作为常规的数组存取 。这个指针是指向实际的Java数组或者Java数组的拷贝的指针。另外,数组的布置保证匹配本地类型。 在C/C++中,jintArray 不能用下标对其进行直接存取,必须用到JNI中提供的接口函数进行操作。 为了存取Java简单类型的数组,就要要使用GetXXXArrayElements函数(见表),XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。 函数 Java 数组类型 本地类型 GetBooleanArrayElements jbooleanArray jboolean GetByteArrayElements jbyteArray jbyte GetCharArrayElements jcharArray jchar GetShortArrayElements jshortArray jshort GetIntArrayElements jintArray jint GetLongArrayElements jlongArray

Android NDK开发之Jni的数据类型

痞子三分冷 提交于 2019-11-26 15:18:01
在前面的一篇博客《 Android NDK开发简介 》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。 JNI是Java代码和C/C++代码通信的桥梁,其角色在某种意义上 就是一个翻译员 ,从设计模式来看叫 适配器。 两者的沟通,首要的一定要对嘴型,对channel,沟通才能到位。计算机程序的基本组 成, 从狭义来讲,就是数据结构+算法。由于Java和C/C++是两种不同的编程语言,它们各自拥有自家定义的数据类型和结构。JNI的第一步就是统一转换其中一方的数据类型,这就好比我们跟外国友人沟通,我们得说英语一样子 。下表是Java的8大基本类型,在Jni层对应的数据描述: Java Native(jni.h) boolean jboolean byte jbyte char jchar short jshort int jint long jlong float jfloat double jdouble 复杂一点的对象类型,其对应的数据描述如下图: 这里补充说明一下: Java中的返回值void和JNI中的void是完全对应的 Java中的基本数据类型(boolean, byte, char, short, int, long, float, double),在JNI中对应的数据类型只要在前面加上 j 就对应了