arm汇编学习(四)
2024-09-26 22:06:44
一、android jni实现
1.静态实现jni:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法。
2.动态实现jni:先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在Java中调用本地方法。
采用静态实现的方式,如果没有进行加密处理,很容易就在IDA导出函数搜到
采用动态实现的方式,还能起到一定的隐藏作用,导出的部分不是就能直接看到java层调的函数名,而是绑定的函数名
native层:
在JNI_OnLoad注册相关函数
JNIEXPORT jstring JNICALL native_hello(JNIEnv *env, jclass clazz)
{
return (*env)->NewStringUTF(env, "hello load jni.");
}
// Java和JNI函数的绑定表
static JNINativeMethod method_table[] = {
{ "HelloLoad", "()Ljava/lang/String;", (void*)native_hello },//绑定
};
java层:
// jni中注册的方法
public native String HelloLoad();
二、Android中调用Arm汇编代码
Android.mk文件
# This file is jni/Android.mk LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 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)
multiple.s符合gnu语法
@ This file is jni/multiple.s
.text
.align
.global armFunction
.type armFunction, %function
armFunction:
@ Multiply by . Input value and return value in r0
stmfd sp!, {fp,ip,lr}
mov r3, r0, asl #
add r0, r3, r0, asl #
ldmfd sp!, {fp,ip,lr}
bx lr
.size armFunction, .-armFunction
直接调用在c中armFunction(input)调用
三、参考:
http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095074.html
http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092491.html
http://my.oschina.net/redhouse/blog/101375
http://blog.csdn.net/dndxhej/article/details/7515949
最新文章
- [NOIP2012] 提高组 洛谷P1081 开车旅行
- 表格边框css
- Android:控件WebView显示网页
- HDU 1698 区间更新
- USB时钟为什么是48MHz
- 【流媒體】live555—VS2008 下live555编译、使用及测试
- HTML5 Shiv – 让该死的IE系列支持HTML5吧(转)
- FFMPEG 截取RTMP直播流图片命令
- Python的多线程实现
- http 响应头之location
- SenchaTouch2.3.1 正在使用listpaging以及pullrefresh插入 分页演示样品做
- JPA关系映射之many-to-many
- 81. Search in Rotated Sorted Array II (中等)
- (汇总)os模块以及shutil模块对文件的操作
- LINQ to Entities 不识别方法“System.DateTime AddDays(Double)
- 《Go语言网络编程》第一章:体系
- Web Worker模拟抢票
- nginx介绍(三) - 虚拟主机
- java中的重载(overload)和重写(override)区别
- BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理