[ANT] Ant脚本封装ndk-build命令并执行打包启动

本篇文章为示范如何在Eclipse中开始一个Jni工程的操作步骤,并假设读者初步了解JNI具体规范及使用ANT脚本。(话说这样的初学者不多见吧…其实我只是想给自己写个总结而已)

/**

* @author sodino

* @mail: [email protected]

* 转载请保留出处。

*/

阅读本文之前,请确保你的开发环境已经满足如下配置:

1.      设置好了Android Sdk及Ndk环境变量。

NDK的安装建议使用MinGW,只要能在命令行中正常运行make gcc程序即是成功了。并在EclipseàPreferencesàNDK填写NDK的本地路径。

2.      支持Ant脚本执行。

3.      Eclipse中安装了CDT插件,可以直接编写C/C++代码。

编写Jni时改动C/C++代码,要执行编译并安装时经过的步骤为:

1.      执行ndk-build

2.      Eclipse中启动编译apk并安装

但是我是个懒汉,在想只要进行一个操作就能安装开始调试了。所以为了更加方便,下面演示创建并编写Jni代码的步骤,在普通步骤结束后,会讲述如何使用一句命令行即可编译jni代码并打包生成apk,最后自动启动APK的Ant脚本。

创建工程TestJni,工程结构如下图。

对应的MainActivity.java的代码如下:

public class MainActivity extends Activity {
    protected voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextViewtxt = (TextView)findViewById(R.id.txtJni);
        txt.setText(hello());
    }
    public native Stringhello();
    static{
        System.loadLibrary("TestJni");
    }
}

接下来处理Jni的事情。

右击工程”TestJni”à” Android Tools” à” Add Native Support…”,在弹出的输入”Add Android Native Support”对话框中输入最终生成的so文件名为“TestJni”如下图。

这时工程结构也会新增加”jni”文件夹并自动生成了TestJni.cpp及Android.mk文件。即Eclipse默认生成C++文件,这与使用javah命令去生成的C头文件是不同的。如下图。

这时来个永恒的”HelloWorld”示例吧。TestJni.cpp文件中的C++代码如下:

#include <string.h>
#include <jni.h>
#ifdef__cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_lab_sodino_testjni_MainActivity_hello(JNIEnv * env, jobject thiz) {
    returnenv->NewStringUTF("HelloWorld!A string from JNI.");
}

#ifdef__cplusplus
}
#endif

代码中extern “C”{}的作用是C++编译的时候,会对函数名进行修饰以用于实现函数充载,而C里面没有这个,所以需要用extern “C”在对头文件进行声明的时候加以区分。这个用于链接的时候进行函数名查找。如果没有此句代码,编译出so文件并打包运行后,会导致java.lang.UnsatisfiedLinkError:Native method not found异常。

此时,在工程目录中执行命令行ndk-build,即生成so文件。工程结构变化如下图:

然后在Eclipse中点击F11,即可自动完成打包及安装到手机或模拟器的工作。运行后效果图如下:

下面要讲述的是使用Ant脚本实现方便编译ndk-build并打包APK及安装到手机的实现方法。

在命令行模式下进入到该工程的目录中,并执行如下命令以生成build.xml脚本。

android updateproject -p . –s

这时工程目录结构发生了变化,新生成了build.xml及local.properties文件如下图。

已经生成的build.xml文件,是支持Ant全编译Android工程的,尝试着在命令行中输入ant debug即可打包生成APK。

ant debug

到了这一步即验证当前的开发环境是支持Ant脚本的。

接下来处理ANT脚本的改动。首先先编译local.properties。内容如下:

### 这个文件用来声明键对<key,value>
### 在build.xml中通过<property file="local.properties" />加载到ant中作为常量
sdk.dir=D:\\Mission\\adt-bundle-windows\\sdk
### 定义apk的包名
app_package=lab.sodino.testjni
### 定义apk的启动入口Activity
app_launch_activity=lab.sodino.testjni.MainActivity
 

最后在build.xml中”<importfile=${sdk.dir}/tools/ant/build.xml”/>中增加如下Ant脚本内容:

    <import file="${sdk.dir}/tools/ant/build.xml" />
	<!-- ==================以下为新增加的内容==================  -->
	<target name="easy">
	    <!-- 编译生成最新的so文件 -->
	    <antcall target="ndk_build"/>
	    <!-- 编译apk工程 -->
	    <antcall target="debug"/>
	    <!-- 执行安装 -->
	    <antcall target="install" />
	    <!-- 启动主界面 -->
		<antcall target="startActivity" />
	</target>

	<!-- target<description>可通过ant -p命令查看 -->
	<target name="ndk_build"
	    description="Compile c/c++ code to so file.">
	    <exec executable="ndk-build.cmd"/>

	    <echo message="out.final.file----${out.final.file}"></echo>
	</target>

	<target name="install"
	    description="install debug.apk">
	    <!-- target:debug调用过后,out.filal.file才会作为常量被初始化。所以单独调用install是无效的 -->
		<echo message="adb install -r  ${out.absolute.dir}/${ant.project.name}-debug.apk"/>

		<apply executable="${sdk.dir}/platform-tools/adb.exe" failonerror="true">
			<arg value="install" />
			<arg value="-r" />
				<file file="${out.absolute.dir}/${ant.project.name}-debug.apk"/>
		</apply>
	</target>
	<target name="startActivity"
	    description="Start Activity: app_package/app_launch_activity">
		<echo message="adb shell am start -n ${app_package}/${app_launch_activity}"/>
            <exec executable="adb">
       		   <arg value="shell"/>
      		   <arg value="am"/>
               <arg value="start"/>
               <arg value="-n"/>
       	       <arg value="${app_package}/${app_launch_activity}"/>
           </exec>
	</target>

代码具体含义可以看注释。

致此,修改TestJni.cpp代码后,只需在命令行下当前工程路径下输入

ant easy

即可实现ndk-build+ 打包 + 安装 + 启动4个动作。如下图。

/**
 * @author sodino
 * @mail: [email protected]
 * 转载请保留出处。
 */

时间: 2024-12-26 17:22:02

[ANT] Ant脚本封装ndk-build命令并执行打包启动的相关文章

在bat脚本中执行另一个bat脚本,下面的命令不再执行

在bat脚本中执行另一个bat脚本,下面的命令不再执行,如下bat.bat: bat1.bat bat2.bat 在执行完bat1.bat 之后直接返回,bat2.bat没有被执行,这种情况下,用call bat1.bat即可解决,如下: call bat1.bat call bat2.bat 至于是什么原因也没有去分析,毕竟bat脚本很少写,能用就好.

1.4 build命令

关于build命令的执行路径问题: 首先,atm的模块构建粒度是模块下的版本文件夹 因此,在版本文件夹下面只能构建一个版本 在path/to/project/family/module/version目录下执行命令 atm build 只会构建:version文件夹 在path/to/project/family/module目录下执行命令 atm build 会构建module下的所有的版本文件夹, 如果只想构建其中的某几个 就执行 atm build -p version1,version2

NDK常用命令

NDK Build 用法(NDK Build) 1.ndk-build的用法 Android NDKr4引入了一个新的.小巧的shell脚本ndk-build,来简化源码编译. 该文件位于NDK根目录,进入你的工程根目录或子目录之后,在命令行下调用即可.例如: cd $PROJECT $NDK/ndk-build NDK指向你的NDK的安装目录,PROJECT指向你的Android工程目录.建议将ndk-build所在目录加入PATH环境变量或设置alias. 2.ndk-build的选项 所有

NDK Build 用法(NDK Build)(转)

1.ndk-build的用法 Android NDKr4引入了一个新的.小巧的shell脚本ndk-build,来简化源码编译. 该文件位于NDK根目录,进入你的工程根目录或子目录之后,在命令行下调用即可.例如: cd $PROJECT $NDK/ndk-build NDK指向你的NDK的安装目录,PROJECT指向你的Android工程目录.建议将ndk-build所在目录加入PATH环境变量或设置alias. 2.ndk-build的选项 所有给ndk-build的选项都会直接传给GNU M

robotium脚本封装为APK,实现脱离手机数据线,使用按钮点击控制用例运行的小功能

最近一直在完成一些robotium的小功能,用来更方便的完成一些小功能的测试,或者可以说用来娱乐吧,幸得群内大神思路指点,就此引申,终于把这个功能得以实现 ---------------将robotium脚本封装为APK,使用按钮控制用例运行覆盖程度,测试结果以简单的xml文件输入到手机SD卡目录下---------------------- 废话不多说,转正题: 一.首先明确一点,这篇文章,是在你所编写的robotium脚本运行无异常的前提下实施 二.阐明思路: 1.我们需要一个运行良好的,逻

一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

作为一个后台程序猿,经常需要把一堆程序集(DLL)或者应用程序(EXE)复制到多个服务器上,实现程序的代码逻辑更新,用以测试新的功能或改动逻辑.这里给大家介绍一个自己实现的PowerShell脚本,方便大家替换DLL或者EXE到多个Windows机器上. 一.   脚本用途 用于方便复制多个文件到多个服务器上. 二.   脚本功能 脚本的主要功能如下: 支持通过最后修改时间过滤文件,设定时间之前的文件不进行复制操作(逻辑设计源于Rebuild代码后只替换新Build出来的有改动的文件): 支持多

将Python脚本封装成exe可执行文件 转

将Python脚本封装成exe可执行文件 http://www.cnblogs.com/renzo/archive/2012/01/01/2309260.html cx_freeze是用来将 Python 脚本封装成可执行程序的工具,支持最新的Python3.2版本.生成的执行文件具有跨平台性,而且运行的系统无须安装Python.目前类似功能的工具还有py2exe 和 PyInstaller,其中貌似py2exe知名度最高了,但是很久没有更新了,至于打包质量不做评价,毕竟萝卜青菜各有所爱:PyI

(二)NS3如何编译、运行脚本和 Command Line命令行参数设置

二.编译.运行脚本和Command Line命令行参数设置 7. 编译和运行脚本主要步骤 1) 将编写的脚本复制到ns-3.22/scratch目录下(可以在ubuntu窗口界面直接复制) 进入ns3目录: /ns-3.22 $ cp examples/tutorial/first.cc  scratch/myfirst.cc将脚本复制到scratch目录下 2) 构建(编译) $ ./waf 3) 运行 $ ./waf --run scratch/myfirst (可能会有运行权限问题,可在r

MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成CREATE和INSERT T-SQL脚本. Mssql-scripter是一个跨平台的命令行工具,功能等同于SQL Server Management Studio中的Generate and Publish Scripts Wizard. 咱们能够在Linux.macOS和Windows上使用它