【问题标题】:NDK build C++ only applicationNDK 构建仅 C++ 的应用程序
【发布时间】:2012-05-03 05:21:32
【问题描述】:

我正在尝试在 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 使用源代码构建。如果你问我,这是非常好的技巧。

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    另一种方法是使用与 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 变得轻而易举;例如,请参阅我的port of Valgrind to Android ARMv7

    【讨论】:

      【解决方案2】:

      正如@Mārtiņš Možeik 在其中一个 cmets 中所提到的,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。这是因为我将-s 用作C_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 服务,然后 execvps 守护进程。

      【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我不反对破解构建系统以生成二进制文件。
      • @Eluco:我仍然认为不破解 android 本身是不可能的。
      • @Eluco: 不知道 tbh ...但我不明白这意味着能够建立一个精灵?
      • 您可以使用 Android NDK 构建可执行文件。而不是 "include $(BUILD_SHARED_LIBRARY)" 写 "include $(BUILD_EXECUTABLE)" 你会在 libs 文件夹下得到你的可执行文件。不确定它对你有多大用处。
      • @MārtiņšMožeiko:干杯,我不知道。不过,AFAIK,如果不构建 java 包装器,您仍然无法运行它...
      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2017-08-05
      • 1970-01-01
      相关资源
      最近更新 更多