【移动安全基础篇】——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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值