Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的完全本机应用程序?_Android - Fatal编程技术网

Android上的完全本机应用程序?

Android上的完全本机应用程序?,android,Android,是否可以开发一个运行时不依赖Dalvik运行时和任何Java库的本机应用程序 基本上,我想制作一个本地二进制文件,我可以通过一个shell运行,这个shell可以在没有system\u服务器进程运行的情况下运行。理想情况下,我希望能够通过OpenGL系统渲染东西来创建自己的窗口服务器,而不是依赖SurfaceFlinger(由于system\u Server没有运行,SurfaceFlinger也会死掉) 我问这个问题的原因是,我想在C/C++中试验较低级别的Android开发,在这种情况下,J

是否可以开发一个运行时不依赖Dalvik运行时和任何Java库的本机应用程序

基本上,我想制作一个本地二进制文件,我可以通过一个shell运行,这个shell可以在没有
system\u服务器
进程运行的情况下运行。理想情况下,我希望能够通过OpenGL系统渲染东西来创建自己的窗口服务器,而不是依赖SurfaceFlinger(由于
system\u Server
没有运行,SurfaceFlinger也会死掉)

我问这个问题的原因是,我想在C/C++中试验较低级别的Android开发,在这种情况下,Java是完全不必要的。因此,基本上,我正在尝试开发一个独立的应用程序,它可以通过OpenGL+Cairo渲染东西并接收HID输入


PS:我知道NDK是什么,但它不是我想要的。我想创建独立的二进制文件,而不是创建在Dalvik VM内部运行的东西。

在设备上运行本机代码有两种可能:使用NDK或将应用程序嵌入框架。据我所知,没有考虑第一种方法,因此,我认为您可以看看第二种方法。下面是如何实现第二种方法的示例

将现有代码移植到自定义Android设备的示例 现在是在博客上发布另一篇技术文章的时候了。这篇文章将介绍如何将现有的c库移植到Android,这是我在Enea进行的开发板演示的一部分

平台添加或NDK 有两种方法可以将本机代码引入Android设备,要么将其添加到平台本身并与框架集成,要么将其包含在应用程序包中。后一种方法已经发展了很多,随着NDK版本5的发布,甚至允许您直接从NDK连接到应用程序生命周期。NDK对于任何需要本机性能、需要重用可移植C库或可能包含在应用程序中的遗留本机代码的应用程序都很有用。NDK与Android SDK很好地集成,是在应用程序中包含本机功能的好方法。对于需要在许多Android设备上重复使用的任何应用程序来说,它都应该是首选方式

另一个选项是包含您的功能,它可以是本机的或Java的,作为所有应用程序使用的API扩展。这只适用于实现这些扩展的设备,对于设备构建者来说,这可能是一个合适的选项。这就是我们在这里的目标

分析现有项目

移植到Android的本机代码并不总是直接的,尤其是如果我们谈论的是C++代码,因为Android使用它自己的C运行时,对其他事物的支持非常有限。如果你想知道更多关于仿生的细节,NDK文档中有一个概述

我想为这个项目移植的代码是Enea LINX for Linux框架,它是一个快速IPC框架。我的目的是能够与运行OSE实时操作系统的控制系统进行交互,该操作系统也实现了这种IPC。LINX由两个内核驱动程序模块、一个用户空间库和一些配置和控制实用程序组成。它是用C语言编写的。之前我用Android中的LINX创建了一个小演示,我单独编译了它,并使用了静态链接,但对于这个项目,我想要一个到Android构建系统的完整端口。它在仿生兼容性方面没有任何问题,因此端口应该是直截了当的

我只想添加一个关于LINX的简短免责声明。我在这里使用它,因为它是一个将解决方案从内核驱动程序到API级别集成到Android的好例子。这段特定的代码确实为系统添加了额外的IPC机制,这或多或少会扰乱安全模型,因此除非您意识到其含义,否则不要使用它。不过,本文中描述的将代码移植到Android所需的步骤适用于您可能希望包含在产品中的任何类型的驱动程序/框架/库

添加内核驱动程序模块 第一步是将内核模块添加到Android构建中。一种方法是构建一个新内核并直接包含它们,但对于这个项目,我选择将它们作为单独的模块保存。Android构建系统不负责内核的构建,这意味着我们构建内核就像构建任何Linux系统一样。目标是基于Atmel的开发板,在LINX模块构建中,我为内核和体系结构提供了头文件和交叉编译工具链

现在来看Android特定部分。我们需要以某种方式将编译后的内核模块添加到平台构建系统中,并创建一个Android.mk文件,在构建时将它们包含在系统映像中。在源目录树中添加一个文件夹,您的项目将放在其中,设备或外部设备是合适的候选项。我创建了一个名为linx的文件夹,它将保存整个linx端口,并在其中添加了一个名为modules的子文件夹,其中放置了预构建的内核模块。现在我们需要的是一个Android makefile,将它们复制到out文件夹中合适的位置,以便生成系统映像。这将看起来像:

Android系统映像上模块的标准位置是system/lib/modules,因此我们将它们复制到这里。如果我们现在构建平台,构建系统将把预编译模块linx.ko复制到我们用于设备的系统映像中。下一步是确保在运行该模块时已在系统上安装该模块。这可以通过shell手动完成,也可以通过我们在init期间运行的脚本完成

在本例中,我创建了一个shell脚本,该脚本将从init.rc启动,包含以下内容:

这包括安装模块和配置
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := linx.ko

LOCAL_MODULE_CLASS := SHARED_LIBRARY

# This will copy the file in /system/lib/modules
#
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/modules

LOCAL_SRC_FILES := $(LOCAL_MODULE)

include $(BUILD_PREBUILT)
#linx init
insmod /lib/modules/linx.ko
insmod /lib/modules/linx_tcp_cm.ko
netcfg eth0 up
ifconfig eth0 192.168.1.12
mktcpcon --ipaddr=192.168.1.21 ControlConn
mklink --connection=tcpcm/ControlConn control_link
...
#linx init script
service linx-setup /system/etc/linx_setup.sh
oneshot
...
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := linx_setup.sh

LOCAL_MODULE_CLASS := ETC

LOCAL_MODULE_PATH := $(TARGET_OUT)/etc

LOCAL_SRC_FILES := $(LOCAL_MODULE)

include $(BUILD_PREBUILT)
Android.mk  
include  
liblinx  
linx_basic  
linxcfg  
linx_setup.sh  
modules
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := linx.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
LOCAL_MODULE := liblinx
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
LOCAL_SRC_FILES := mktcpcon.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
LOCAL_STATIC_LIBRARIES += liblinxcfg
LOCAL_SHARED_LIBRARIES += liblinx
LOCAL_MODULE := mktcpcon
include $(BUILD_EXECUTABLE)