• 【移动安全基础篇】——11、Android_jni


    1. Android_jni 与 so and java
    Android 程序分为 java 和 native 两层,java 层是 java 代码编译成的 dex 文件,native 层是 c++代码编译成的 so(动态链接库)文件。两者通过 jni(java native interface)进行链接。
    相比于 java 层,native 层的安全性更高,隐蔽性更好,在一些情况下效率也更高,当前的加密和检测一般都在 native 层中进行。
    2. Android studio 的原生 jni 支持
    Android studio 支持 jni 代码编程,可以直接创建编译 so 库,需修改 gradle 文件来开启jni 支持。
    修改步骤:
    1) 修改./gradle/wrapper/gradle-wrapper.properties
    2) 修改 build.gradle

    buildscript{
    dependencies{
    classpath ‘com.android.tools.build:gradle-experimental:0.6.0-beta5’ //使用实验性
    的 gradle
    }
    }

    3) 修改 build.gradle(一个示例)

    如果 java 包无法编译通过,报告版本错误的,可以添加下面这段

    tasks.withType(JavaCompile){ //指定编译 JDK 版本
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
    }

    3. Native 函数与注册
    So 库中通常具有 Jni_onLoad 函数,是 so 加载时候同时启动的,执行一些初始化操作,可以不进行重写。

    Native 函数声明

    例如函数 public static pHello();
    Java 层声明为 public native static String pHello();

    静态注册方法:

    Native 层 则 为 JNIEXPORT  jstring  JNICALL
    Java_f8_hellonative_MainActivity_Hello1(JNIENV *env, jclass type)

    So 中的名字为类名+函数名的组合,并且自带两个参数:

    JNIENV* env
    jclass(static 方法时)或者 jobject(普通方法时)

    动态注册方法:
    调用 RegisterNatives 函数

    可以使用下面的函数注册

    4. Demo

    Ljava/Lang/String 改为 Ljava/lang/String

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    SQLServer基本函数
    XP极限编程
    中日完全相同的四字成语
    SQL Server和Oracle的常用函数对比
    HTTP请求头概述
    XP(Extreme Programming)
    查看汉字各种编码值
    XP极限编程(中英文对照)
    http 头信息详解
    ASP内置对象详解
  • 原文地址:https://www.cnblogs.com/devi1/p/13486455.html
Copyright © 2020-2023  润新知