一、汇编文件
multiple.s 注意后缀
@ This file is jni/multiple.s
.text
.align 2
.global armFunction
.type armFunction, %function
armFunction:
@ Multiply by 10. Input value and return value in r0
stmfd sp!, {fp,ip,lr}
mov r3, r0, asl #3
add r0, r3, r0, asl #1
ldmfd sp!, {fp,ip,lr}
bx lr
.size armFunction, .-armFunction
二、调用汇编的方法
直接调用
/* This file is jni/hello-jni.c */
#include <jni.h>
/* This stub calls the function. It helps to have a stub like this to
* save yourself the hassle of defining the function call in
* Assembly. */
jint Java_com_eggwall_android_assembly_AssemblyActivity_factorialJNI(
JNIEnv* env, jobject object, jint input) {
/* Try calling some local code */
return armFunction(input);
}
三、修改Android.mk
arm和thumb的区别:
在一般的情况下,Thumb指令与ARM指令的时间效率和空间效率关系为: - Thumb代码所需的存储空间约为ARM代码的60%~70% - Thumb代码使用的指令数比ARM代码多约30%~40% - 若使用32位的存储器,ARM代码比Thumb代码快约40% - 若使用16位的存储器,Thumb代码比ARM代码快约40%~50% - 与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。
斩乱麻 15:33:32ARM指令集是32位的thumb是16位的,是精简ARM指令集,主要用于内存非常紧张的地方。
LOCAL_ARM_MODE添加进汇编文件
# This file is jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# I want ARM, not thumb.
LOCAL_ARM_MODE := arm
# Name of the local module
LOCAL_MODULE := hello-jni
# The files that make up the source code
LOCAL_SRC_FILES := hello-jni.c multiple.s
include $(BUILD_SHARED_LIBRARY)
参考
http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html