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前缀 与 类名 以及类名之间的包名 和 方法名之间 使用 “_” 进行分割;
例如:
上面可以看到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返回值;
(2) 找到要调用的方法的methodID
使用jni.h中提供的GetMethodID方法, 获取jmethodID, 传入参数 ①JNIEnv指针 ②Class对象 ③ 方法名 ④方法签名, 在这里方法名和方法签名确定一个方法, 方法签名就是方法的返回值 与 参数的唯一标示;如果方法是静态的, 就使用GetStaticMethod方法获取
(3) 在C语言中调用相应方法
普通方法 : CallTypeMethod , 其中的Type随着返回值类型的不同而改变;
静态方法 : CallStaticTypeMethod, 其中的Type随着返回值类型不同而改变;
参考文章:
http://blog.csdn.net/shulianghan/article/details/18964835
欢迎关注微信公众号:DroidMind
精品内容独家发布平台
呈现与博客不一样的技术干货
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
精品内容独家发布平台
呈现与博客不一样的技术干货
相关文章推荐
- Android Studio中如何打JAR包
- android开发常用框架
- Android设计模式——单例模式。
- 如何设置Android中控件的颜色透明度
- Android 从系统媒体库中选择视频
- BroadcaseReceiver刷新页面
- 基于Android6.0的RIL框架层模块分析
- Android线程,线程池使用及原理博文参考
- Android 操作系统的内存回收机制
- Android中ScrollView与listView冲突以及ScrollView与listView无法滑动(拖动)解决办法
- Android开发规范
- Android高效加载大图、多图解决方案,有效避免程序OOM
- AndroidManifest.xml
- android xml解析,xml to JavaBean
- android之View坐标系
- android 动画类型
- Android开发笔记(十四)数据库操作的基本方法
- Gradle DSL method not found: 'android()'Possible causes:may be using a version of Gradle that does n
- AndroidManifest.xml配置文件
- Android开发之性能优化