1

我正在尝试在 Android 上构建本机守护程序。目的是控制一些特定的硬件,Java 应用程序将能够使用套接字与这个守护进程通信。

同时我一直在使用 cmake 来编译我的库、演示和真正的守护进程(顺便说一句,它工作得很好)。我现在正在尝试做两件不同的事情:

  1. 使用ndk-build.
  2. 通过使 JNI 调用与 c++ 守护程序的工作方式非常相似,将 C++ 守护程序移植到 Android 服务。

据我了解,ndk-build不能制作本机应用程序,而只能制作本机库,而这些库又可以由 Java GUI 加载……我正确吗?对于第 1 步,我真的不需要 java(并且我已经证明了这一点),但我还没有找到一种 ndk-build吐出精灵应用程序的方法。

供参考 - 我正在使用 cmake,如下所述:http: //opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html

这样我就可以为“普通”linux构建,也可以为android使用源代码构建。如果你问我,这是相当不错的 hack。

4

3 回答 3

2

另一种方法是使用与 NDK 捆绑在一起的脚本make-standalone-toolchain.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

# Create folder if it doesn't already exist.
mkdir -p $folder

$NDK_HOME/build/tools/make-standalone-toolchain.sh \
    --toolchain=arm-linux-androideabi-$ver \
    --platform=android-$api --install-dir=$folder

运行上面的行将在 处生成一个新的独立工具链$HOME/bin/android-14-ndk-4.7,然后您可以将其用作任何常规 C/C++ 交叉编译工具链。

使用独立工具链的优势在于,它使将 Linux 项目交叉编译到 Android 变得轻而易举;例如,请参阅我将 Valgrind 移植到 Android ARMv7 的端口

于 2013-07-22T19:16:36.607 回答
1

正如@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 生成的二进制文件大约是 40 kb。这是因为我用作-saC_FLAG然后 gcc 将动态剥离生成的对象。这可以稍后通过调用$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip或为您的拱门提供相应的条来完成。

由于我没有在互联网上找到有关此功能的文档,因此还有一些话:

  • 这很好用,这里没问题:)
  • 这必须保存在一个名为jni/Android.mk.
  • 代码必须保存在 JNI 目录中
  • 如果您的代码在jni目录之外,这会变得很难看,但并非不可能。您只需要在代码前面加上相应的前缀,不要忘记修改包含路径。这留给读者作为练习。
  • 仍然不确定为什么从 Android 构建系统生成的代码比cmake. 我之前说过strip不调用 - 但是在将 *.so 复制到lib目录之前调用它。
  • 仍然不知道如何将该二进制文件打包成一个 android 包,甚至不知道如何在不修改 Android 代码的情况下运行它(例如当系统启动时)。我假设我可以编写一个在启动时启动的 Java 服务,然后execvp是守护进程。
于 2012-04-22T09:38:17.547 回答
0

您的选项 2 是 AFAIK 的唯一方法。

于 2012-04-22T08:16:45.980 回答