一、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

arm汇编学习(四)的更多相关文章

  1. android ARM 汇编学习 —— hello world

    android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析 adb putty 连上手机,用busybox vi 写一个 hello ...

  2. arm汇编学习(五)

    新增个手写GNU语法arm的方法,以后可以狂逆狂写 hello.S文件 .data msg: .ascii "Hello, ARM!\n" len = . - msg .text ...

  3. ARM汇编学习笔记

    ARM  RISC  (Reduced Instruction Set Computers) X86   CISC  (Complex Instruction Set Computers)      ...

  4. arm汇编学习(三)

    一.ndk编译android上运行的c程序 新建个hello目录,底下要有jni目录,下面就是Android.mk文件 1.Android.mk文件内容如下: LOCAL_PATH:= $(call ...

  5. android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析

    学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...

  6. arm汇编学习(六)---跳转到thumb状态

    通常函数返回使用 pop {r7,pc}或bx lr等方式(bx,b类似jmp为跳转指令,但bx可以指定跳转区域究竟为thumb还是arm指令.thumb指令指令的时候,直接填写该地址却总是产生SIG ...

  7. ARM 汇编学习笔记

  8. ARM汇编指令集_学习笔记(1)

    一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...

  9. ARM学习笔记11——GNU ARM汇编程序设计

    GNU ARM汇编程序设计中,每行的语法格式如下: [<label>:] [<instruction | directive | pseudo-instruction>] @c ...

随机推荐

  1. Linux之shell

    shell的中文意思是外壳. 通常在图形界面中对实际体验带来的差异不是不同发行版本的终端模拟器,而是shell这个壳. 壳在核外,shell里面的核就是linux内核. shell指的是:提供给使用者 ...

  2. Comparación para 2019 Nueva Lonsdor K518S y K518ISE

    Comparación para 2019 Nueva Lonsdor K518S y Lonsdor K518ISE: Igual: Capacidades de Immo y cobertura ...

  3. android 捕获未try的异常

    1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...

  4. springboot 接口返回数据时 net.sf.json.JSONNull["empty"]) 异常

    @ResetController返回数据时出现异常 Could not write JSON: Object is null; nested exception is com.fasterxml.ja ...

  5. Android Notification 的四种使用方式

    实现通知步骤 一般实现通知需要如下步骤: 1.获取 NotificationManager 实例管理通知: 2.实例 Notification 对象: 3.管理事件 Intent: 4.发送通知. 注 ...

  6. Kettle 中生成随机数 或者GUID唯一标识符

    添加步骤  "生成随机数"  英文名字叫  "Generate Random Value" 如下图..选择UUID..

  7. Oracle 数据表的管理

    1.创建表的的表名规则 a.必须已字母开头 b.长度不能超过30 c.不能是Oracle的保留字 d.只能使用如下字符:A-Z.a-z.1-9.#,$等 2.Oracle基本数据类型 2.1 字符型数 ...

  8. Oracle 中运用rollup和cube实现汇总运算

    前言.看了很多的随笔博文内容都是关于rollup和cube的用法,发现一个问题,很多都是一样或者转载的,但这都不是重点,重点是,他们写的都太专业化了,直接给一个结论,并没有给出整个推理出这个结论的过程 ...

  9. JDBC(1)-连接数据库

    主要步骤包括: 加载驱动: 连接数据库: 使用语句操作数据库: 关闭数据库连接,释放资源. 1.需要导包: 2.加载数据驱动: mysql驱动名:com.mysql.jdbc.Driver 加载方式: ...

  10. 【LESS系列】简介和使用

    LESS —— 一个CSS预编译框架,它在CSS的语法基础之上,引入了变量.Mixin(混入).运算以及函数等功能,大大简化了CSS的编写,并且降低了CSS的维护成本,就像它的名称所说的那样,LESS ...