Ant CruiseControl.net ndk在不带Cygwin的64位Windows上构建

Ant CruiseControl.net ndk在不带Cygwin的64位Windows上构建,ant,android-ndk,java-native-interface,cruisecontrol.net,Ant,Android Ndk,Java Native Interface,Cruisecontrol.net,最新的Android NDK(版本8)允许调用NDK build,而无需安装额外的cygwin 我的问题是:我可以将其插入CruiseControl.Net进行定期本机构建吗? 我假设我很可能需要使用Ant作为构建方法,然后将其添加到ccnet服务器配置中 因此,问题是: 如何从Ant命令调用ndk build.cmd 如何配置build.xml文件? 我尝试了几种方法,但都失败了。如果可能的话,你能给我一些线索吗 好的,我取得了一些进展,我能够通过ant或nant构建jni代码,但在这两种情

最新的Android NDK(版本8)允许调用
NDK build
,而无需安装额外的cygwin

我的问题是:我可以将其插入CruiseControl.Net进行定期本机构建吗?

我假设我很可能需要使用Ant作为构建方法,然后将其添加到ccnet服务器配置中

因此,问题是:

  • 如何从Ant命令调用
    ndk build.cmd

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


好的,我取得了一些进展,我能够通过ant或nant构建jni代码,但在这两种情况下,将其插入cc.net服务器配置会给我带来严重错误:

但现在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
生成失败-0个非致命错误,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>

我的项目名称
到我的项目的路径
G:\nant-0.92\bin\nant.exe
到我的项目的路径
MYPROJECTNAME.build
建造
1200
和我的NAnt生成文件:

<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试图运行另一个用于linux的ndk版本,但缺少了一些命令,如uname。
你知道cI可能做错了什么吗?

好的,我取得了一些进展,我能够通过ant或nant构建jni代码,但在这两种情况下,将其插入cc.net服务器配置会给我带来严重错误:

但现在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
生成失败-0个非致命错误,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>

我的项目名称
到我的项目的路径
G:\nant-0.92\bin\nant.exe
到我的项目的路径
MYPROJECTNAME.build
建造
1200
和我的NAnt生成文件:

<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试图运行另一个用于linux的ndk版本,但缺少了一些命令,如uname。
你知道cI可能做错了什么吗?

在Windows上使用CC.net尝试直接从build.xml调用“ndk build.cmd”时,我遇到了同样的问题(CreateProcess失败等)。我想出了如何让它工作,所以我觉得有必要分享我的解决方案

首先,创建一个1行Windows命令文件,如下所示(我将其命名为“ndkwrapper.cmd”):

接下来,创建一个简单的bashshell脚本,如下所示(名为“ndkwrap.sh”):

当然,您的确切路径(对于您的工作区和NDK目录)可能不同,但请特别注意“/cygdrive/c”指的是“c:”

创建上面的脚本后,这里一个非常重要的步骤是将行尾从Windows转换为UNIX。您可以使用免费提供的名为“dos2unix.exe”的实用程序来执行此操作。我不记得是从哪里得到的,但它是移植到Windows的GNU/Linux工具开源包的一部分。(在“UNIX Windows文件实用程序”上搜索)如果不转换行结尾,sh或bash将无法读取脚本,并且您将得到关于“\r”的各种错误

因此,要调用“ndk-build.cmd clean”的等效项,例如,您需要键入“ndkwrapper.cmd clean”来删除中间版本并输出与ndk相关的构建文件,以准备完整的ndk构建

在Windows上CC.net的build.xml文件中,可以按如下方式调用NDK makefile:

<tasks>
  <exec>
    <executable>cmd.exe</executable>
    <baseDirectory>C:\Android</baseDirectory>
    <buildArgs>/C ndkwrapper.cmd clean</buildArgs>
  </exec>
<exec executable=".\gradlew.bat">
    <baseDirectory>$(projSrcDir)</baseDirectory>
    <buildArgs>clean assemblePlayRelease assembleProRelease</buildArgs>
    <buildTimeoutSeconds>900</buildTimeoutSeconds>
</exec>

命令提示符
C:\Android
/C ndkwrapper.cmd清洁
希望这有帮助


Ben

我在Windows上使用CC.net尝试直接从build.xml调用“ndk build.cmd”时遇到了相同的问题(CreateProcess失败等)。我想出了如何让它工作,所以我觉得有必要分享我的解决方案

首先,创建一个1行Windows命令文件,如下所示(我将其命名为“ndkwrapper.cmd”):

接下来,创建一个简单的bashshell脚本,如下所示(名为“ndkwrap.sh”):

当然,您的确切路径(对于您的工作区和NDK目录)可能不同,但请特别注意“/cygdrive/c”指的是“c:”

创建上面的脚本后,这里一个非常重要的步骤是将行尾从Windows转换为UNIX。您可以使用免费提供的名为“dos2unix.exe”的实用程序来执行此操作。我不记得是从哪里得到的,但它是移植到Windows的GNU/Linux工具开源包的一部分。(在“UNIX Windows文件实用程序”上搜索)如果不转换行结尾,sh或bash将无法读取脚本,并且您将得到关于“\r”的各种错误

因此,要调用“ndk-build.cmd clean”的等效项,例如,您需要键入“ndkwrapper.cmd clean”来删除中间版本并输出与ndk相关的构建文件,以准备完整的ndk构建

在Windows上CC.net的build.xml文件中,可以按如下方式调用NDK makefile:

<tasks>
  <exec>
    <executable>cmd.exe</executable>
    <baseDirectory>C:\Android</baseDirectory>
    <buildArgs>/C ndkwrapper.cmd clean</buildArgs>
  </exec>
<exec executable=".\gradlew.bat">
    <baseDirectory>$(projSrcDir)</baseDirectory>
    <buildArgs>clean assemblePlayRelease assembleProRelease</buildArgs>
    <buildTimeoutSeconds>900</buildTimeoutSeconds>
</exec>

命令提示符
C:\Android
/C ndkwrapper.cmd清洁
希望这有帮助


Ben

我观察到将ndk构建作为CCNET任务运行时也存在问题。 我花了一段时间,但最后我注意到,您必须提供
HOST\u OS
HOST\u ARCH
作为ndk构建参数才能运行

<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>

指令
/C ndk build HOST\u OS=windows HOST\u ARCH=x86-B ndk\u PROJECT\u PATH=[PROJECT]应用程序构建脚本=[ANDROIDMKFIL]
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.
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=
)
SET OS=%os%