Ant CruiseControl.net ndk在不带Cygwin的64位Windows上构建
最新的Android NDK(版本8)允许调用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代码,但在这两种情
NDK build
,而无需安装额外的cygwin
我的问题是:我可以将其插入CruiseControl.Net进行定期本机构建吗?
我假设我很可能需要使用Ant作为构建方法,然后将其添加到ccnet服务器配置中
因此,问题是:
- 如何从Ant命令调用
ndk build.cmd
- 如何配置
文件? 我尝试了几种方法,但都失败了。如果可能的话,你能给我一些线索吗build.xml
<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%