Android NDK构建C++;唯一应用
我正在尝试在Android上构建一个本机守护进程。其目的是控制某些特定的硬件,Java应用程序将能够使用套接字与该守护进程通信 与此同时,我一直在使用cmake来编译我的库、演示和真正的守护进程(顺便说一句,它工作得很好)。我现在尝试做两件不同的事情:Android NDK构建C++;唯一应用,android,android-ndk,Android,Android Ndk,我正在尝试在Android上构建一个本机守护进程。其目的是控制某些特定的硬件,Java应用程序将能够使用套接字与该守护进程通信 与此同时,我一直在使用cmake来编译我的库、演示和真正的守护进程(顺便说一句,它工作得很好)。我现在尝试做两件不同的事情: 使用ndk Build构建相同的应用程序 将C++守护进程通过Android的服务,通过使JNI调用与C++守护进程的工作方式非常相似。 据我所知,ndk build不能生成本机应用程序,只能生成本机库,而本机库又可以由Java GUI加载。。。
ndk Build
构建相同的应用程序李>
ndk build
不能生成本机应用程序,只能生成本机库,而本机库又可以由Java GUI加载。。。我说得对吗?对于step1,我并不真正需要java(我已经证明了这一点),但我已经找到了一种方法,可以让ndk build
生成一个elf应用程序
仅供参考-我正在使用cmake,如下所述:
通过这种方式,我可以为“普通”linux构建,也可以使用android的源代码外构建。如果你问我的话,这是一个很好的破解。你的选择2是唯一可以快速完成的方法。正如@MārtiņšMožeik在一篇评论中提到的,
Android.mk
的图片将起作用:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_daemon
LOCAL_C_INCLUDES := src
LOCAL_SRC_FILES := src/daemon.c
include $(BUILD_EXECUTABLE)
我注意到的一点是,这个“makefile”生成的二进制文件是130k,而cmake生成的二进制文件是~40kb。这是因为我使用了-s
作为C_标志
,然后gcc将动态剥离生成的对象。稍后可以通过调用$NDK/toolschains/arm-linux-androideabi-4.4.3/prebuild/linux-x86/bin/arm-linux-androideabi strip
或arch对应的strip来完成此操作
由于我还没有在互联网上找到有关此功能的文档,请再多说几句:
- 这个很好用,这里没问题:)
- 这必须保存在名为
的文件中李>jni/Android.mk
- 代码必须保存在JNI目录中
- 如果您的代码在
目录之外,那么这会很难看,但并非不可能。您只需要在代码前面加上相应的前缀,不要忘记修改include路径。这将留给读者作为练习jni
- 仍然不确定为什么Android构建系统生成的代码比cmake生成的代码大。我之前说过,
没有被调用,但是它是在*.so被复制到strip
目录之前被调用的李>lib
- 仍然不知道如何将二进制文件打包到android软件包中,甚至不知道如何在不修改android代码的情况下运行它(例如,当系统启动时)。我假设我可以编写一个Java服务,在启动时启动,然后
s守护进程execvp
生成独立的工具链.sh
来创建独立的工具链,然后使用它来编译您的项目。下面的shell代码说明了如何使用它:
# Assumed path to the NDK, change it to suit your environment.
NDK_HOME=$HOME/bin/android-ndk-r8e
# Desired API and NDK versions and destination folder of
# the stand-alone toolchain, change them to suit your needs.
api=14
ver=4.7
folder=$HOME/bin/android-$api-ndk-$ver
mkdir $folder
cd $folder
$NDK_HOME/build/tools/make-standalone-toolchain.sh \
--toolchain=arm-linux-androideabi-$ver \
--platform=android-$api --install-dir=$(pwd)
运行上面的代码将在$HOME/bin/android-14-ndk-4.7
生成一个新的独立工具链,您可以将其用作任何常规的C/C++交叉编译工具链
使用独立工具链的优势在于,它可以轻松地将Linux项目交叉编译到Android;例如,请参见我的。我不反对通过黑客攻击构建系统来生成二进制。@Eluco:我仍然认为,如果不攻击android本身,这是不可能的。@Eluco:不知道tbh。。。但我不明白这是如何暗示能够构建elf的?你可以用Android NDK构建可执行文件。不使用“include$(BUILD\u SHARED\u LIBRARY)”而使用“include$(BUILD\u EXECUTABLE)”,您将在libs文件夹下获得可执行文件。不知道它对你有多有用。@MārtiņšMožeiko:干杯,我不知道。但是,如果没有构建java包装器,你仍然无法运行它。请注意,仿生(Android LIB)对C++异常处理的支持有限,因此你可能需要重新考虑端口。裁判: