Android JNI学习笔记2
来源:互联网 发布:编程求解一元二次方程 编辑:程序博客网 时间:2024/05/29 15:35
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
- android jni 学习笔记2
- Android JNI学习笔记2
- android JNI 学习笔记
- android JNI 学习笔记
- android jni 学习笔记
- android JNI 学习笔记
- Android JNI 学习笔记
- android JNI 学习笔记
- Android JNI学习笔记
- Android JNI 学习笔记
- Android JNI 学习笔记
- android JNI 学习笔记1
- android学习笔记之JNI
- android JNI入门-学习笔记
- 学习Android JNI开发笔记
- Android学习笔记16-JNI
- [android学习笔记]学习jni编程
- Android JNI学习笔记1(Android Studio)
- c3p0连接配置
- kmp单片自动机
- POJ 1661 Help Jimmy
- Xcode 配置 路径
- 各大牛逼网站推荐系统
- Android JNI学习笔记2
- AttributedString
- 秒杀核心设计(减库存部分)-防超卖与高并发
- 转-android沉浸式状态栏:Translucent System Bar 的最佳实践
- WPF获取键盘状态(如WPF组合键)
- activity管理
- 最大子序列和
- Java反射和工厂模式
- 文章的相关性对网站优化到底有多重要?