2012-08-09 41 views
0

最新的Android NDK(版本8)允许呼叫ndk-build没有额外的cygwin安装。CruiseControl.net ndk-建立在Windows 64位没有Cygwin

我的问题是:我可以插入CruiseControl.Net这个定期的本地构建吗?

我认为最有可能我会需要使用蚂蚁作为构建方法,然后将其添加到CCNET服务器配置。

所以问题是:

  • 如何调用ndk-build.cmd蚂蚁命令

  • 如何配置build.xml文件? 我尝试了几种方法,但都失败了。如果可能,你能给我一些线索吗?

回答

0

好我得到了一些进步,我能够通过蚂蚁或恶性但在这两种情况下,插入到cc.net服务器配置来构建JNI代码给我strane错误:

但现在CC .NET让我奇怪的错误:

<builderror> 
     <type>NAnt.Core.BuildException</type> 
     <message><![CDATA[External Program Failed: G:\\android-ndk-r8b\\ndk-build.cmd (return code was 2)]]></message> 
     <location> 
     <filename>G:/MYPath/project.build</filename> 
     <linenumber>7</linenumber> 
     <columnnumber>4</columnnumber> 
     </location> 
     <stacktrace><![CDATA[ at NAnt.Core.Tasks.ExternalProgramBase.ExecuteTask() 
    at NAnt.Core.Tasks.ExecTask.ExecuteTask() 
    at NAnt.Core.Task.Execute() 
    at NAnt.Core.Target.Execute() 
    at NAnt.Core.Project.Execute(String targetName, Boolean forceDependencies) 
    at NAnt.Core.Project.Execute() 
    at NAnt.Core.Project.Run()]]></stacktrace> 
    </builderror> 
    </failure> 
    <duration>296.40000000000003</duration> 
</buildresults>Buildfile: file:///G:/MYPath/project.build 
Target framework: Microsoft .NET Framework 4.0 
Target(s) specified: build 

清洁:

[echo] Starting Android ndk CLEAN ... 
[exec] Android NDK: Unable to determine HOST_OS from uname -s:  
[exec] Android NDK: Please define HOST_OS in your environment.  
[exec] process_begin: CreateProcess(NULL, uname -s, ...) failed. 
[exec] G:/android-ndk-r8b/build/core/init.mk:131: *** Android NDK: Aborting. . Stop. 

构建失败 - 0非致命错误(S),2个警告

我在cc.net配置项目:

<project> 
    <name>MY_PROJECT_NAME</name> 
    <workingDirectory>PATH_TO_MY_PROJECT</workingDirectory> 
    <tasks> 
     <nant> 
      <executable>G:\nant-0.92\bin\Nant.exe</executable> 
      <baseDirectory>PATH_TO_MY_PROJECT</baseDirectory> 
      <buildFile>MYPROJECTNAME.build</buildFile> 
      <buildArgs>build</buildArgs> 
      <buildTimeoutSeconds>1200</buildTimeoutSeconds> 
     </nant> 
    </tasks> 
</project> 

我的楠构建文件:

<project name="my name" default="build" basedir="."> 
    <description>My project Build Files.</description> 
    <target name="clean" description="remove all generated files"> 
     <echo message="Starting Android ndk CLEAN ..."/> 
     <exec program="G:\\android-ndk-r8b\\ndk-build.cmd" failonerror="true" 
      basedir="MY PROJECT PATH"> 
      <arg value="clean" /> 
     </exec> 
     <echo message="Android ndk CLEAN done."/> 
    </target> 
    <target name="build" description="remove all generated files" depends="clean"> 
     <echo message="Starting Android ndk BUILD ..."/> 
     <exec program="G:/android-ndk-r8b/ndk-build.cmd" failonerror="true" /> 
     <echo message="Android ndk BUILD done."/> 
    </target> 
</project> 

正如我所说的,我可以为我的项目运行Nant.exe并清理和建设正确。 它看起来像cc.net试图运行其他ndk-build commend用于Linux和缺少一些命令为uname。 你知道cI可能会做错什么吗?

2

当尝试直接从build.xml使用Windows上的CC.net调用“ndk-build.cmd”时,遇到了同样的问题(CreateProcess故障等)。我想出了如何使这个工作,所以我觉得不得不分享我的解决方案。

首先,创建一个1行的Windows命令文件如下(我把它命名为 “ndkwrapper.cmd”):

sh ndkwrap.sh %1 %2 %3 

接下来,如下(名为“ndkwrap.sh创建一个简单的bash shell脚本“):

#!/usr/bin/sh 
# Wrapper around ndk-build script for Windows 
# 

NDK_PROJECT_PATH=/cygdrive/c/workspace/agnc_android 
export NDK_PROJECT_PATH 
/cygdrive/c/Android/android-ndk-r8b/ndk-build $1 $2 $3 

当然,你的确切路径(工作区和NDK目录)可以是不同的,但要注意,特别地,该 “/ cygdrive/C” 是指 “C:”。

在上面创建脚本之后,一个非常重要的步骤是将行结束符从Windows转换为UNIX。您可以使用一个名为“dos2unix.exe”的实用程序来完成此操作,该实用程序可以免费使用。我不记得我在哪里,但它是移植到Windows的一些开源的GNU/Linux工具包的一部分。 (Google上的“用于Windows的UNIX文件实用程序”。)如果您不转换行结束符,那么sh或bash将无法读取脚本,并且您会得到有关“\ r”的各种错误...因此,为了调用等效的“ndk-build.cmd clean”,例如,你需要输入“ndkwrapper.cmd clean”来删除你的中间和输出NDK相关的构建文件,准备完整的NDK构建。

在为CC.net build.xml文件在Windows上,你可以调用NDK生成文件如下:

<tasks> 
    <exec> 
    <executable>cmd.exe</executable> 
    <baseDirectory>C:\Android</baseDirectory> 
    <buildArgs>/C ndkwrapper.cmd clean</buildArgs> 
    </exec> 

希望这有助于!

1

我观察运行NDK建造作为CCNET任务时也存在问题。 我花了一段时间,但最后我注意到,你必须提供HOST_OSHOST_ARCH作为ndk-build参数让它运行。

<exec> 
    <executable>cmd</executable>   
    <buildArgs>/C ndk-build HOST_OS=windows HOST_ARCH=x86 -B NDK_PROJECT_PATH=[PROJECT] APP_BUILD_SCRIPT=[ANDROIDMKFILE] NDK_APPLICATION_MK=[APPLICATIONMKFILE] NDK_LOG=1</buildArgs> 
    <buildTimeoutSeconds>120</buildTimeoutSeconds> 
</exec> 

希望它可以帮助任何人节省时间。

0

最初的问题是询问有关蚂蚁的构建。这个答案与CC.NET中的问题有关,蚂蚁和gradle构建将以同样的方式受到影响。

我们使用gradle和一些自定义gradle任务,可以通过调用ndk-build.cmd(来自其中没有空格的路径)来编译项目的本机代码。

gradle文件准备好后,shell启动的gradle builds可以工作,但cc.net发起的build会失败。

我们CC.NET任务定义如下:

<exec executable=".\gradlew.bat"> 
    <baseDirectory>$(projSrcDir)</baseDirectory> 
    <buildArgs>clean assemblePlayRelease assembleProRelease</buildArgs> 
    <buildTimeoutSeconds>900</buildTimeoutSeconds> 
</exec> 

的问题是关系到一个CC.NET错误,导致shell变量名是小写。 Windows shell脚本不关心shell变量名称的情况,但是因为NDK启动使得可变大小写成为一个问题。作为构建过程一部分的init.mk make文件依赖于shell变量名来标识主机操作系统类型。特别是shell变量OS。通常,OS的值的定义如下:

OS=Windows_NT 

但当变量传递从CC.NET到摇篮它被转化成这样:

os=Windows_NT 

这导致在初始化的检测机构。MK失败,尝试执行UNIX检测序列和寻找Unix的UNAME实用程序,不存在在Windows上导致:

Android NDK: Unable to determine HOST_OS from uname -s: 
Android NDK: Please define HOST_OS in your environment. 
make.exe: Entering directory `D:/CC.NET/svncheckout/pes/src/project/src/main/jni' 
make.exe: Leaving directory `D:/CC.NET/svncheckout/pes/src/project/src/main/jni' 

而最终:

process_begin: CreateProcess(NULL, uname -s, ...) failed. 
c:/ndk/build/core/init.mk:160: *** Android NDK: Aborting. . Stop. 
FAILURE: Build failed with an exception. 

的解决方法是小于理想但它完成了工作。我们的想法是编辑ndk-build.cmd,并且仅在从CC.NET构建时才更改传递变量的大小写。

在NDK-build.cmd的关闭@echo线后只需插入此代码:

IF DEFINED ccnetproject (
    ECHO Applying Environment variable hack for CC.NET. 
    SET OS2=%os% 
    SET OS= 
    REM SET PATH=%path% 
    SET TEMP2=%temp% 
    SET TEMP= 
) 

IF DEFINED ccnetproject (
    SET OS=%OS2% 
    SET OS2= 
    SET TEMP=%TEMP2% 
    SET TEMP2= 
) 

此脚本首先对在较低的情况下,OS和TEMP变量值的临时副本。接下来,通过清除它们的值来取消定义它们。最后反过来完成。需要因为只是说

SET OS=%os% 

没有做太多,因为脚本是不区分大小写

两个步骤。它首先找到操作系统变量,找到一个小写版本并将自己的值赋给自己。

这是在CC.NET v1.6.7981.1,gradle v1.1.0和Android NDK v10(64位)上测试的。