您的位置:首页 > 移动开发 > Android开发

Android JNI学习笔记2

2016-06-22 11:00 288 查看
1. JNI

Java本地接口,Java Native Interface, 它是一个协议, 该协议用来沟通Java代码和外部的本地C/C++代码, 通过该协议 Java代码可以调用外部的本地代码, 外部的C/C++ 代码可以调用Java代码;

也就是说JNI提供了一个桥梁, 打通了C语言和Java语言之间的障碍;JNI提供了一种规范; 可以让我们在C代码中找到Java代码class中的方法, 并且调用该方法; 也可以在Java代码中, 将一个C语言的方法映射到Java的某个方法上;

NDK与JNI区别 :

– NDK: NDK是Google开发的一套开发和编译工具集, 主要用于Android的JNI开发;

– JNI : JNI是一套编程接口, 用来实现Java代码与本地的C/C++代码进行交互;

2、JNI方法命名规则

JNI实现的方法 与 Java中Native方法的映射关系 : 使用方法名进行映射, 可以使用 javah 工具进入 bin/classes 目录下执行命令, 即可生成头文件;

JNI方法名规范 :

返回值 + Java前缀 + 全路径类名 + 方法名 + 参数( JNIEnv + 参数 ; jobject + 其它参数);

注意分隔符 : Java前缀 与 类名 以及类名之间的包名 和 方法名之间 使用 “_” 进行分割;

例如:

package com.example.hellojni;

class HelloJni {
public native String stringFromJNI();
}

JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
(JNIEnv *env, jobject obj);


上面可以看到java层native方法stringFromJNI对应的本地方法为Java_com_example_hellojni_HelloJni_stringFromJNI。

JNI方法参数介绍:

第一个参数是JNI接口指针 JNIEnv;

如果Native方法是非静态的, 那么第二个参数就是对Java对象的引用, 如果Native方法是静态的, 那么第二个参数就是对Java类的Class对象的引用;

3、 JNIEnv

JNIEnv作用 : JNIEnv 是一个指针,指向了一组JNI函数, 这些函数可以在jni.h中查询到,通过这些函数可以实现 Java层 与 JNI层的交互 , 通过JNIEnv 调用JNI函数 可以访问java虚拟机, 操作java对象;

4、JNI数据类型

Java数据类型 C数据类型 JNI数据类型对比 :



5、C语言代码回调Java方法

C代码回调Java方法的流程

(1) 找到java对应的Class

创建一个char*数组, 然后使用jni.h中提供的FindClass方法获取jclass返回值;

char* classname = "com/example/hellojni/HelloJni";
jclass dpclazz = (*env)->FindClass(env, classname);


(2) 找到要调用的方法的methodID

使用jni.h中提供的GetMethodID方法, 获取jmethodID, 传入参数 ①JNIEnv指针 ②Class对象 ③ 方法名 ④方法签名, 在这里方法名和方法签名确定一个方法, 方法签名就是方法的返回值 与 参数的唯一标示;如果方法是静态的, 就使用GetStaticMethod方法获取

(3) 在C语言中调用相应方法

普通方法 : CallTypeMethod , 其中的Type随着返回值类型的不同而改变;

静态方法 : CallStaticTypeMethod, 其中的Type随着返回值类型不同而改变;

参考文章:

http://blog.csdn.net/shulianghan/article/details/18964835

欢迎关注微信公众号:DroidMind

精品内容独家发布平台





呈现与博客不一样的技术干货
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: