如何在Android中使用汇编语言

 由于Android环境非常复杂,框架都是用Java,因此要使用C/C++都需要做很多配置,使用汇编的话需要做更多的工作。

我这边使用的是最新的Android4.0的开发工具,NDK也是最新支持4.0的。这个NDK与老版本的有一些比较明显的不同。

由于我用的是Mac OS X,因此配置起来比瘟抖死上的要容易许多,你不需要再装些杂七杂八的第三方工具,直接可以使用你下载好的NDK。

首先,设置目标路径——在你的Terminal中进入NDK的根目录,随后打NDK_PROJECT_PATH="<你要编译的项目路径>"。回车,再输入export NDK_PROJECT_PATH

回车。

这里要注意的是NDK_PROJECT_PATH=后面的路径需要加引号,否则无效。

 


由于NDK默认支持的默认编译选项仅支持ARMv5到ARMv5TE架构,因此如果要使用比较高级的特性的话有两种方法:

1、你有办法将TARGET_ARCH_ABI的值变为armeabi-v7a,俺自己试了一下,木有成功。因此可以使用第二种方法,更简单便捷:

2、在你的NDK目录下,找到toolchains,然后找到arm-linux-androideabi-x.y.z目录,在进去可以发现setup.mk文件。找到-march=armv7-a,将上面的神马#ifdef都去掉,下面的#endif也都删了。这样就能确保编译器使用ARMv7A来编译。


完成上述操作之后我们就可以先用最简单的方式来写汇编了,即内联汇编——

?
static  int  my_thumb( int  dummy)
{
     __asm__( "movw r0, #1001 \t\n"
             "movw r12, #2020 \t\n"
             "add r0, r0, r12 \t\n"
             "bx  lr" );
     
     return  dummy;
}

 jstring

Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                   jobject thiz )
{
     my_thumb(0);
     return  (*env)->NewStringUTF(env, "Hello from JNI !" );

}

 上述代码其实就是基于NDK自带的hello-jni项目修改的。最后用ndk-build可以成功编译。


 

上面一段代码是编译器默认的使用Thumb/Thumb-2编译的,因此我里面写的内联汇编的指令都是Thumb代码。

我们下面将讲述一下如何使用ARM代码并使用NEON指令集。

首先,在你的Android.mk中修改LOCAL_SRC_FILES,要将源文件名后面添加.neon后缀,比如LOCAL_SRC_FILES := hello-jni.c改成LOCAL_SRC_FILES := hello-jni.c.neon。

这里要注意的是你真正的源文件名不要修改,就修改LOCAL_SRC_FILES这个符号的值即可。

然后我们再添加新的变量,来指示ARM GCC使用ARM指令集来编译——LOCAL_ARM_MODE := arm

这样就OK了。我们修改一下代码:

 

 

详细请看:
http://www.cnblogs.com/zenny-chen/archive/2011/11/01/2232305.html
 
 

 

你可能感兴趣的:(ASM,android,Android汇编语言)