zoukankan      html  css  js  c++  java
  • arm汇编学习(四)

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

    直接调用在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

  • 相关阅读:
    程序设计课程技巧小总结
    《大学之路》读后感(1)
    《世界是数字的》读后感(4)
    《世界是数字的》读后感(3)
    《世界是数字的》读后感(2)
    《世界是数字的》读后感(1)——第一部分 硬件
    独立思考的能力——《不要等到毕业以后》读后感(2)
    迷茫且鉴定——《不要等到毕业以后》读后感(1)
    HashTable HashMap区分
    使用media query 来实现响应式设计
  • 原文地址:https://www.cnblogs.com/moonflow/p/3228172.html
Copyright © 2011-2022 走看看