Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.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 NDK构建C++;唯一应用_Android_Android Ndk - Fatal编程技术网

Android NDK构建C++;唯一应用

Android NDK构建C++;唯一应用,android,android-ndk,Android,Android Ndk,我正在尝试在Android上构建一个本机守护进程。其目的是控制某些特定的硬件,Java应用程序将能够使用套接字与该守护进程通信 与此同时,我一直在使用cmake来编译我的库、演示和真正的守护进程(顺便说一句,它工作得很好)。我现在尝试做两件不同的事情: 使用ndk Build构建相同的应用程序 将C++守护进程通过Android的服务,通过使JNI调用与C++守护进程的工作方式非常相似。 据我所知,ndk build不能生成本机应用程序,只能生成本机库,而本机库又可以由Java GUI加载。。。

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

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

  • 使用
    ndk Build
    构建相同的应用程序
  • 将C++守护进程通过Android的服务,通过使JNI调用与C++守护进程的工作方式非常相似。 据我所知,
    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目录中
    • 如果您的代码在
      jni
      目录之外,那么这会很难看,但并非不可能。您只需要在代码前面加上相应的前缀,不要忘记修改include路径。这将留给读者作为练习
    • 仍然不确定为什么Android构建系统生成的代码比cmake生成的代码大。我之前说过,
      strip
      没有被调用,但是它是在*.so被复制到
      lib
      目录之前被调用的
    • 仍然不知道如何将二进制文件打包到android软件包中,甚至不知道如何在不修改android代码的情况下运行它(例如,当系统启动时)。我假设我可以编写一个Java服务,在启动时启动,然后
      execvp
      s守护进程

    另一种方法是使用与NDK捆绑的脚本
    生成独立的工具链.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++异常处理的支持有限,因此你可能需要重新考虑端口。裁判: