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