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

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

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

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

更多相关文章

  1. android 逆向工程
  2. Android中怎么破解游戏之修改金币数
  3. [Android]如何做一个崩溃率少于千分之三噶应用app(5)-极速增量编译
  4. ANDROID Bionic C DOCS
  5. Symbian学习笔记(8):再尝试着做一个数独游戏
  6. 【android】如何有效的减少重复的代码
  7. android 4.0以上WebView不能全屏播放视频的解决办法
  8. Android(安卓)Native进程间通信实例—Socket本地通信服务端进程
  9. Android如何防止apk程序被反编译(尊重劳动成果)

随机推荐

  1. android 集合与json之间的相互转换
  2. Android | 代码混淆到底做了什么?
  3. Android 蓝牙开发研究
  4. 一起学android之DigitalClock与TextClock
  5. Android 消息机制学习
  6. android中在java代码中设置Button按钮的
  7. Android 工程目录结构介绍
  8. vue H5与(Android、iOS)原生APP交互
  9. Android不再使用Oracle专属的Java API将
  10. Android(安卓)监测手机联网状态 wifi、移