2012-04-22 109 views
1

我试图在Android上构建本机守护程序。控制某些特定硬件的目的和Java应用程序将能够使用套接字与此守护程序进行通信。NDK构建仅适用于C++的应用程序

我一直在使用cmake编译我的库,演示程序和真正的守护进程(它工作正常BTW)。我现在试图做两件不同的事情:

  1. 使用ndk-build构建相同的应用程序。
  2. 通过使JNI调用与C++守护进程非常相似,将C++守护进程移植到Android服务。

据我所知,ndk-build不能生成本地应用程序,但只能生成本地库,而这又可以通过Java GUI加载......我是否正确?对于step1我并不真的需要java(我已经证明它已经),但我还没有找到一种方法让ndk-build吐出一个精灵应用程序。

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

这样我可以有用于建立“正常”的Linux和Android的同时使用了源建立。如果你问我,那很好。

回答

1

正如在评论中提及了由@马丁斯Možeik,这PICE的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服务,然后是守护进程execvp
+0

请注意,Bionic(Android libc)对C++异常处理的支持有限,所以您可能需要重新考虑端口。参考:http://en.wikipedia.org/wiki/Bionic_%28software%29 – Samveen 2012-04-27 10:27:43

0

您的选择2是唯一的方法来做它AFAIK。

+0

我不反对黑客构建系统吐出二进制文件的选项。 – elcuco 2012-04-22 08:19:18

+0

@Eluco:我还是认为没有黑客攻击android本身就没有可能。 – Goz 2012-04-22 08:31:43

+0

那么什么是“$ NDK/build/code/build-biary.mk”? – elcuco 2012-04-22 08:38:29

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 

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;例如见我的port of Valgrind to Android ARMv7

相关问题